3.4. I/O 스레드를 늘려 요청 처리 처리량 개선
네트워크 스레드는 클라이언트 애플리케이션에서 요청을 생성 및 가져오는 등 Kafka 클러스터에 대한 요청을 처리합니다. 요청 생성은 요청 큐에 배치됩니다. 응답은 응답 큐에 배치됩니다.
리스너당 네트워크 스레드 수는 복제 요소 및 클라이언트 생산자 및 소비자의 활동 수준이 Kafka 클러스터와 상호 작용해야 합니다. 많은 요청이 있을 경우 스레드 수를 늘릴 수 있으며, 시간 스레드 양을 사용하여 더 많은 스레드를 추가할 시기를 결정할 수 있습니다.
혼잡을 줄이고 요청 트래픽을 제어하려면 요청 큐에서 허용되는 요청 수를 제한할 수 있습니다. 요청 큐가 가득 차면 들어오는 모든 트래픽이 차단됩니다.
I/O 스레드는 요청 대기열에서 요청을 선택하여 처리합니다. 스레드를 더 많이 추가하면 처리량이 향상될 수 있지만 CPU 코어 및 디스크 대역폭의 수는 실제 상한이 적용됩니다. 최소한 I/O 스레드 수는 스토리지 볼륨 수와 같아야 합니다.
# ... num.network.threads=3 1 queued.max.requests=500 2 num.io.threads=8 3 num.recovery.threads.per.data.dir=4 4 # ...
모든 브로커의 스레드 풀에 대한 구성 업데이트가 클러스터 수준에서 동적으로 발생할 수 있습니다. 이 업데이트는 현재 크기의 절반과 현재 크기의 두 배로 제한됩니다.
다음 Kafka 브로커 메트릭은 필요한 스레드 수를 작업하는 데 도움이 될 수 있습니다.
-
Kafka.network:type=SocketServer,name=NetworkProcessorAvgIdlePercent는 평균 시간 네트워크 스레드가 백분율로 유휴 상태인 메트릭을 제공합니다. -
Kafka.server:type=KafkaRequestHandlerPool,name=RequestHandlerAvgIdlePercent는 평균 I/O 스레드가 백분율로 유휴 상태인 메트릭을 제공합니다.
0%의 유휴 시간이 있는 경우 모든 리소스가 사용 중이므로 스레드를 더 추가하는 것이 유용할 수 있습니다. 유휴 시간이 30% 미만으로 떨어지면 성능이 저하될 수 있습니다.
디스크 수로 인해 스레드가 느리거나 제한되는 경우 네트워크 요청에 대한 버퍼 크기를 늘려 처리량을 개선할 수 있습니다.
# ... replica.socket.receive.buffer.bytes=65536 # ...
또한 Kafka가 수신할 수 있는 최대 바이트 수를 늘립니다.
# ... socket.request.max.bytes=104857600 # ...