1. ghz 란 무엇인가요?
ghz는 gRPC 서비스 부하 테스트 및 벤치마킹을 위한 명령 줄 유틸리티 및 Go로 개발된 패키지 입니다. 서비스를 로컬로 테스트하고 디버깅하는데 사용합니다. 쉽게 말해, jmeter와 같은 역할을 수행하지만, gRPC에 특화된 명령줄 프로그램이라고 보시면 됩니다.2. 설치 가이드
- 설치 : https://ghz.sh/docs/install
- Install Go 1.14 on CentOS 8 | CentOS 7
# 아래의 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"}' {호출주소}:{호출포트}
사실 위의 명령어를 보면, 크게 어려운 부분은 없습니다. 간단하게 설명을 하도록 하겠습니다.
- 옵션 사용방식
- Insecure : 암호화 통신 미사용
- Async : 가능한 요청을 비동기식으로 진행, 다음을 호출하기전에 요청이 완료됐는지를 기다리지 않음.
- Import-paths : proto 폴더
- Proto : 사용할 proto 파일
- call : 실제 수행할 method 명시
- n : 총실행하는 요청수
- rps : 총 수행하는 초당 요청수. 동시성 옵션에 지정된대로 모든 작업자에게 분배됨.
- concurrency 관련된 옵션은 5에서 시작하여 5초마다 5개씩 늘려서 50명의 작업자가 됐을때까지 계단식(step)으로 호출하는 내용.
- d : 파라미터 옵션
4. 실제 호출
그렇다면, 애초에 테스트를 해보고싶었던, kubernetes grpc pod들 앞단에 연결되어있는 서비스를 호출하기로했습니다. 그런데, 서비스를 호출하기 위해서는 쿠버네티스 안에서 호출을 해야하기 때문에 샘플 파드(nginx)를 띄워서 그안에 go + ghz를 설치하고 호출하기로 했습니다. 결과는 아래와 같이 특정 pod에서만, 서비스를 계속해서 호출하고 있었습니다.
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/함께 보면 좋은 글
- [DevOps] ec2-gazua 사용법 및 커스터마이징
- [DevOps] Nginx Lua module 사용법
- [DevOps] Istio virtualhost 사용법
- [DevOps] Golang gRPC 서버 구축하기 2편
새 글이 올라오면 Threads @wonizz.ai 에도 올립니다. 팔로우해 두면 피드에서 바로 볼 수 있습니다.