본문 바로가기
Programming/Loadtest

[Loadtest][k6] k6 grpc Performance testing

by guru_k 2022. 3. 30.
728x90
반응형

gRPC

gRPC 는 구글에서 개발된 오픈소스 RPC 프레임 워크 입니다.

인간이 읽을수 있는 형태로 되어있는 JSON과는 다르게 gRPC는 바이너리이며 더 컴팩트하고 전송속도가 빠른 장점이 있습니다

API Types

Unary

Single Request ↔︎ Single Response

Server Streaming

Single Request ↔︎ Multiple Responses

Client Streaming

Multiple Requests ↔︎ Single Response

Bi-directional Streaming

Multiple Requests ↔︎ Multiple Responses

The .proto definition

메시지와 서비스들은 Protocol buffers, or protobuf의 정의를 포함하여 .proto 파일들에 명시되어 있습니다.

이런 정의된 파일은 sender와 receiver가 사용되는 코드로 사용되어지고 이러한 규약을 통해 이러한 메시지와 서비스들의 통신이 진행 됩니다.

 

Performance Testing

k6 설치하는 방법은 아래 링크 참조

 

Installation

Instructions to install k6 in Linux, Mac, Windows. Use the Docker container or the prebuilt binary.

k6.io

테스트를 위한 폴더를 생성 합니다.

$ mkdir grpc_test
$ cd grpc_test

hello.proto 라는 파일을 아래와 같이 definition 폴더 아래 만들어 줍니다. 

// $ mkdir definitions
// $ cd definitions
// $ vi hello.proto


syntax = "proto2";

package hello;

service HelloService {
  rpc SayHello(HelloRequest) returns (HelloResponse);
  rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
  rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
  rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
}

message HelloRequest {
  optional string greeting = 1;
}

message HelloResponse {
  required string reply = 1;
}

grpc_test.js 라고 테스트 스크립트를 grpc_test 폴더 내부에 만들어 줍니다.

// $ cd ../
// $ vi grpc_test.js


import grpc from 'k6/net/grpc';
import { check, sleep } from 'k6';

const client = new grpc.Client();
client.load(['definitions'], 'hello.proto');

export default () => {
  client.connect('grpcbin.test.k6.io:9001', {
    // plaintext: false
  });

  const data = { greeting: 'Bert' };
  const response = client.invoke('hello.HelloService/SayHello', data);

  check(response, {
    'status is OK': (r) => r && r.status === grpc.StatusOK,
  });

  console.log(JSON.stringify(response.message));

  client.close();
  sleep(1);
};

테스트를 실행 해봅니다.

// $ k6 run grpc_test.js

          /\      |‾‾| /‾‾/   /‾‾/   
     /\  /  \     |  |/  /   /  /    
    /  \/    \    |     (   /   ‾‾\  
   /          \   |  |\  \ |  (‾)  | 
  / __________ \  |__| \__\ \_____/ .io

  execution: local
     script: scripts/grpc-test.js
     output: -

  scenarios: (100.00%) 1 scenario, 1 max VUs, 10m30s max duration (incl. graceful stop):
           * default: 1 iterations for each of 1 VUs (maxDuration: 10m0s, gracefulStop: 30s)

INFO[0000] {"reply":"hello Bert"}                        source=console

running (00m01.4s), 0/1 VUs, 1 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs  00m01.4s/10m0s  1/1 iters, 1 per VU

    ✓ status is OK

    checks...............: 100.00% ✓ 1   ✗ 0
    data_received........: 3.0 kB  2.1 kB/s
    data_sent............: 731 B   522 B/s
    grpc_req_duration....: avg=48.44ms min=48.44ms med=48.44ms max=48.44ms p(90)=48.44ms p(95)=48.44ms
    iteration_duration...: avg=1.37s   min=1.37s   med=1.37s   max=1.37s   p(90)=1.37s   p(95)=1.37s
    iterations...........: 1       0.714536/s
    vus..................: 1       min=1 max=1
    vus_max..............: 1       min=1 max=1

테스트 진행 시 grpc client는 k6에서 제공되는 grpc test server (grpcbin.test.k6.io:9001) 에 접속하게 되고 test server에 정의되어있는 hello.proto에 따라 처리 됩니다.

 

728x90
반응형

'Programming > Loadtest' 카테고리의 다른 글

[k6][Loadtest] k6 grpc client load path  (0) 2022.03.30

댓글