3.4. I/O スレッドの増加によるリクエスト処理スループットの向上
ネットワークスレッドは、クライアントアプリケーションからのリクエストの生成や取得など、Kafka クラスターへのリクエストを処理します。生成リクエストはリクエストキューに配置されます。応答は応答キューに配置されます。
リスナーごとのネットワークスレッドの数は、レプリケーション係数と、Kafka クラスターと、対話するクライアントプロデューサーおよびコンシューマーからのアクティビティーのレベルを反映する必要があります。リクエストが多い場合は、スレッドがアイドル状態である時間を使用してスレッドの数を増やし、スレッドを追加するタイミングを決定できます。
輻輳を軽減し、要求トラフィックを規制するには、要求キューで許可されるリクエスト数を制限できます。要求キューがいっぱいになると、すべての着信トラフィックがブロックされます。
I/O スレッドはリクエストキューからリクエストを選択して処理します。スレッド数を増やすとスループットが向上しますが、CPU のコアの数とおよびディスク帯域幅により、実用的な上限が決まります。最低でも、I/O スレッドの数はストレージボリュームの数と同じでなければなりません。
# ...
num.network.threads=3
queued.max.requests=500
num.io.threads=8
num.recovery.threads.per.data.dir=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
# ...