2017-12-05 12 views
1

먼저 GRPC 클라이언트 - 서버 구현과 웹 소켓 + 클라이언트 - 서버 구현 간의 처리량/대기 시간에 대한 성능 비교를 수행 한 사람이 있습니까? 아니면 적어도 비슷한 것.GRPC 서버 응답 대기 시간

이 목표를 달성하기 위해 예제 JAVA helloworld grpc client-server를 시험해보고 응답 대기 시간을 유사한 websocket 클라이언트 서버와 비교하려고합니다. 현재 내 로컬 컴퓨터의 클라이언트와 서버 모두에서이 작업을 시도하고 있습니다.

websocket client-server에는 서버 측에서 간단한 while 루프가 있습니다. grpc 서버의 경우 비동기 실행 모델을 사용합니다. 클라이언트 요청마다 새로운 스레드가 생성되어 추가 처리 오버 헤드가 발생합니다. 예를 들어, 측정중인 websocket 응답 대기 시간은 6-7ms이며 grpc 예제는 약 600-700ms의 대기 시간을 보여 주므로 프로토 부프 오버 헤드를 고려합니다.

grpc와 유사한 비교를 수행하려면 grpc 서버를 동 기적으로 실행하는 방법이 있습니까? 비동기 처리에 의해 도입 된 스레드 생성/디스패치 및 기타 내부 오버 헤드의 오버 헤드를 제거 할 수 있기를 원합니다.

grpc에 포함 된 protobuf 오버 헤드가 websocket 클라이언트 - 서버 예제에없는 것을 이해합니다. 그러나 나는 protobuf 처리에 의해 도입 된 오버 헤드를 측정함으로써이를 설명 할 수있다.

또한, 내가 동기로 grpc 서버를 실행할 수 없다면 적어도 스레드 디스패치/비동기 처리 오버 헤드를 측정 할 수 있습니까?

나는 비교적 새로운 JAVA이기 때문에 내 무지를 용서해 준다.

답변

1

Java에서의 벤치마킹은 잘못하기 쉽습니다. 여러 레벨의 JIT가 시작될 때까지 몇 초간 워밍업 할 필요가 있습니다. 또한 힙 크기가 수평이 될 시간이 필요합니다. 단순한 원 샷 벤치 마크에서는 클래스 로딩으로 인해 가장 빨리 실행되는 코드가 (코드와 관계없이) 쉽게 볼 수 있습니다. 600 ms는 gRPC 대기 시간에 대해 엄청나게 큰 숫자입니다. Google Compute Engine에서 TLS를 사용하여 두 대의 컴퓨터 사이에 around 300 µs median latency이 표시됩니다. 난 당신이 워밍업을 기대하지 않으므로 자바가 gRPC를로드하는 데 걸리는 시간을 계산하고 gRPC로 인터프리터를 사용하여 Java를 측정하고 있습니다.

gRPC 서버의 동기 버전이 없으며 기본적으로 별도의 스레드로 실행될 수도 있습니다. grpc-java는 캐시 된 쓰레드 풀을 사용하기 때문에 초기 요청 이후에 gRPC는 서비스를 호출하기 위해 쓰레드를 재사용 할 수 있어야한다.

꼬리 대기 시간이 추가 될 수 있지만 스레드 간 점프 비용은 일반적으로 낮습니다. 일부 인 프로세스 NOOP 벤치 마크에서는 여분의 스레드와 4μs를 사용하지 않고 8μs의 RPC 완료를 확인합니다. 그래도 실제로 원한다면 serverBuilder.directExecutor()을 사용하여 스레드 홉을 피할 수 있습니다. 대부분의 서비스는 이 해당 옵션을 사용하여 느리게이되고 서비스 처리가 I/O를 지연시킬 수 있으므로 실제로 처리 속도가 낮습니다.

0

grpc와 유사한 비교를 수행하려면 grpc 서버를 동 기적으로 실행하는 방법이 있습니까? 비동기 처리에 의해 도입 된 스레드 생성/디스패치 및 기타 내부 오버 헤드의 오버 헤드를 제거 할 수 있기를 원합니다.

동기 클라이언트를 만들 수 있습니다. 일반적으로 비동기 방식이 더 빠릅니다. (스칼라에서 테스트 됨) 비 블로킹 방식으로 얻은 모든 리소스를 간단하게 사용할 수 있습니다. 얼마나 많은 클라이언트가 서버가 초 당 처리 할 수 ​​있는지에 대한 요청을 테스트 할 것입니다.서비스가 중단되지 않도록 클라이언트 당 들어오는 요청을 제한 할 수 없습니다. 비동기는 HTTP 2의 경우도 더 좋습니다. HTTP 2는 멀티플렉싱을 제공합니다.

벤치 마크의 경우 메트릭을 추천 할 수 있습니다. 로그 또는 http 엔드 포인트를 통해 메트릭을 표시 할 수 있습니다.