[DevOps] gRPC load test 툴 ghz 사용법

안녕하세요? 정리하는 개발자 워니즈입니다. 이번시간에는 gRPC에 대해서 부하 테스트를 진행할 수 있는 툴을 소개해보려고 합니다. gRPC 서버를 간단하게 구축을 했는데, 해당 어플리케이션을 kubernetes에 올리고 앞단에 서비스로 연결하여 올렸습니다. 그런데, gRPC는 http/2 기반으로 요청이 가다보니까 하나의 connection을 맺어두고 계속해서 request를 요청하는 방식이기에 부하 분산이 잘 안된다는 포스팅을 보았습니다.

쿠버네티스에서의 gRPC

이 포스팅에서 말하는 이야기는 gRPC는 http/2 통신을 하기 때문에 별도의 proxy 역할을 하는 모듈이 있어야 하고, envoy나 linkerd 와 같은 별도의 어플리케이션을 띄워서 어플리케이션의 사이트카로 배치하기를 권고 하고 있습니다.

그렇다면, 실제로 gRPC로 가는 트래픽에 대해서 부하를 주기위해서 여러가지 툴을 서칭해보기 시작했습니다. 그중에서 ghz라는 툴이 가장 많이 사용되어지는거 같아서, 설치하고 활용하는 방법에 대해서 정리를 하기로 했습니다.

ghz_1

1. ghz 란 무엇인가요?

ghz는 gRPC 서비스 부하 테스트 및 벤치마킹을 위한 명령 줄 유틸리티 및 Go로 개발된 패키지 입니다. 서비스를 로컬로 테스트하고 디버깅하는데 사용합니다. 쉽게 말해, jmeter와 같은 역할을 수행하지만, gRPC에 특화된 명령줄 프로그램이라고 보시면 됩니다.

2. 설치 가이드

  • 설치 : https://ghz.sh/docs/install

설치는 위의 가이드대로 잘 나와 있습니다. 우선 필자는 로컬(Mac)환경에 테스트를 위해서 설치를 진행했습니다. 보시는 것처럼 설치는 2가지 방식으로 굉장히 심플합니다. 하지만 사전에 Go가 설치되어있어야 합니다. Go에 대한 설치 가이드는 리눅스를 기반으로 작성이 되었습니다.

  • Install Go 1.14 on CentOS 8 | CentOS 7

Go 언어는 Golang이라 불리우며, 굉장히 안정적이고 간단하며 효율적인 소프트웨어 애플리케이션을 구축하기 위한 최신 오픈 소스 프로그래밍 언어 입니다. 특히 Kubernetes, Prometheus, Docker, Terraform 등과 같은 인기있는 어플리케이션을 지원하기에 굉장히 매력적입니다.

# 아래의 2가지 방식중 한가지를 이용하여 goinstall.sh 파일을 다운로드 받습니다. 
--- With curl ---
curl -O https://raw.githubusercontent.com/canha/golang-tools-install-script/master/goinstall.sh

--- With wget ---
wget https://raw.githubusercontent.com/canha/golang-tools-install-script/master/goinstall.sh
# 실행 권한 추가 
$ chmod +x goinstall.sh

참고로, ghz는 1.14상위 버전에서 동작을 하므로, 최소 1.14를 설치하여야 합니다.

# 아래의 명령어를 이용하여 설치
--- Install Go latest ---
$ ./goinstall.sh

--- Install Go 1.14 ---
$ ./goinstall.sh --version  1.14

--- Install Go 1.13 ---
$ ./goinstall.sh --version  1.13
Go 1.14 was installed into /root/.go.
Make sure to relogin into your shell or run:

    source /root/.bashrc

to update your environment variables.
Tip: Opening a new terminal window usually just works. :)

설치가 완료되면, 위와 같은 문구가 출력이 되고 bashrc파일을 source 명령어를 통해서 소싱합니다.

$ go version
go version go1.14 linux/amd64
  • Go 삭제
$ ./goinstall.sh  --remove
Go removed.
  • ghz 설치
# clone repository
git clone https://github.com/bojand/ghz

# source build
make build

# build using go
cd cmd/ghz
go build .

위의 명령어를 통해서 설치가 가능합니다. 굉장히 쉽죠?

3. 사용법

가장 중요한 부분이 사용법입니다. 간단하게 로컬에서 파일을 구성해보고 호출하는 방법에 대해서 정리를 해보겠습니다. 지난 시간에 gRPC 간단한 서버를 구성할때, proto path와 proto 파일을 명시하는 것을 기억해야 합니다. ghz도 동일하게 proto path를 지정하고 proto 파일을 지정함으로써 실제 호출할 method를 통해서 호출이 가능합니다.

ghz --insecure --async --import-paths /test/test-solution/libs/protocol/src/main/proto \
  --proto /test/test-solution/libs/protocol/src/main/proto/framework/query/balance_query.proto \
  --call com.test.query.testServiceV1/BaseCoinBalance \
  -n 10000 --rps 200 \
  --concurrency-schedule=step --concurrency-start=5 --concurrency-step=5 --concurrency-end=50 --concurrency-step-duration=5s \
  -d '{"address":"Hello"}' {호출주소}:{호출포트}

사실 위의 명령어를 보면, 크게 어려운 부분은 없습니다. 간단하게 설명을 하도록 하겠습니다.

  • 옵션 사용방식
    1. Insecure : 암호화 통신 미사용
    2. Async : 가능한 요청을 비동기식으로 진행, 다음을 호출하기전에 요청이 완료됐는지를 기다리지 않음.
    3. Import-paths : proto 폴더
    4. Proto : 사용할 proto 파일
    5. call : 실제 수행할 method 명시
    6. n : 총실행하는 요청수
    7. rps : 총 수행하는 초당 요청수. 동시성 옵션에 지정된대로 모든 작업자에게 분배됨.
    8. concurrency 관련된 옵션은 5에서 시작하여 5초마다 5개씩 늘려서 50명의 작업자가 됐을때까지 계단식(step)으로 호출하는 내용.
    9. d : 파라미터 옵션

ghz_2

대강 위와 같은 그림과 비슷한 모습으로 계단식으로 점점 RPS를 홀리고 최대치까지 다다르면, 총 request를 모두 마칠때까지 유지가 될 것입니다.

4. 실제 호출

그렇다면, 애초에 테스트를 해보고싶었던, kubernetes grpc pod들 앞단에 연결되어있는 서비스를 호출하기로했습니다. 그런데, 서비스를 호출하기 위해서는 쿠버네티스 안에서 호출을 해야하기 때문에 샘플 파드(nginx)를 띄워서 그안에 go + ghz를 설치하고 호출하기로 했습니다.

결과는 아래와 같이 특정 pod에서만, 서비스를 계속해서 호출하고 있었습니다.

ghz_3

gRPC를 학습하면서 여러가지를 경험하는 것 같았습니다. 확인해보니, 앞서 이야기했던 것처럼 http/2 통신을 하면서 하나의 pod와 connection을 맺게 되면, request를 지속적으로 해당 pod로 보내게 됩니다. 따라서, 이부분은 istio(envoy proxy)를 통해서 해결을 했고, 추후에 포스팅으로 작성하도록 하겠습니다.

5. 마치며..

이번시간에는 ghz 툴에 대해서 설치 가이드 및 간단한 사용법에 대해서 정리를 해보았습니다. jmeter만 알고있던 필자가 여러가지 손쉬운 툴이 있다는 것에 대해서 새삼 놀라웠고, 그 사용법도 굉장히 심플해서 좋았던 것 같습니다. gRPC load balancing에 대해 학습을 하다가 부하 분산 툴에 대해서 서칭하고 사용하게 되었던 것 같습니다.

gRPC 를 부하분산하기 위해서는 앞단에 ingress를 연결하거나 혹은 각 pod별로 프록시 사이드카를 둠으로써 해결 할 수 있습니다. 다음번 포스팅에서는 istio(envoy proxy) 사용법에 대해서 정리를 해보도록 하겠습니다.

6. 출처

https://computingforgeeks.com/how-to-install-go-on-centos-centos-linux/

https://ghz.sh/

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다