对一个真实运行中的broker进程做jcmd线程转储,数出网络线程和请求处理线程真实各有多少个、分别对应哪个配置项,理解一个请求从socket到真正被处理经过了哪两拨线程。
命令 · shell $ jcmd <broker2的pid> Thread.print | grep -E "kafka-(network|request-handler)-thread"
"data-plane-kafka-network-thread-2-PLAINTEXT-PLAINTEXT-0" ... "data-plane-kafka-network-thread-2-PLAINTEXT-PLAINTEXT-1" ... "data-plane-kafka-network-thread-2-PLAINTEXT-PLAINTEXT-2" ... "data-plane-kafka-network-thread-2-CONTROLLER-PLAINTEXT-0" ... "data-plane-kafka-network-thread-2-CONTROLLER-PLAINTEXT-1" ... "data-plane-kafka-network-thread-2-CONTROLLER-PLAINTEXT-2" ...
这台broker2真实同时开着两个监听端口——真实对外的PLAINTEXT数据端口,和真实给controller quorum内部通信用的CONTROLLER端口。每个端口真实各分到了3个网络线程(编号0/1/2),跟server.properties里配的num.network.threads=3正好对上——这个参数真实控制的是"每一个监听端口配几个线程",不是全局共用3个,两个端口加起来这台broker真实一共跑着6个网络线程。
"data-plane-kafka-request-handler-0" ... "data-plane-kafka-request-handler-1" ... "data-plane-kafka-request-handler-2" ... "data-plane-kafka-request-handler-3" ... "data-plane-kafka-request-handler-4" ... "data-plane-kafka-request-handler-5" ... "data-plane-kafka-request-handler-6" ... "data-plane-kafka-request-handler-7" ...
每一步都是本文上面用jcmd Thread.print跑出来的原始结果。