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 # ...
すべてのブローカーのスレッドプールへの設定の更新は、クラスターレベルで動的に発生する可能性があります。これらの更新は、現在のサイズの半分から現在のサイズの 2 倍までに制限されます。
次の 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 # ...