问题描述
在鲲鹏 920 服务器(64 核 / 512GB 内存 / 2TB NVMe SSD)上部署 Kafka 3.6 集群做日志收集,发现 Broker 的磁盘 IO 利用率经常跑到 100%,但实际消息吞吐并不高。用 iostat -x 1 观察,NVMe SSD 的 %util 打满,await 飙到 20ms 以上,而 x86 同配置环境下 IO 利用率仅 30% 左右。
排查过程
用 perf 分析 Kafka Broker 进程的 IO 相关系统调用:
大量时间花在 bfq_dispatch_request 上。bfq(Budget Fair Queueing)调度器设计初衷是为 SATA HDD 优化顺序 IO,对 NVMe SSD 的高并发随机 IO 反而成为瓶颈——bfq 的合并排序逻辑增加了额外开销。
优化方案
第一步:切换 IO 调度器为 none
第二步:优化 Kafka 刷盘配置
第三步:NUMA 感知部署
效果验证
使用 kafka-producer-perf-test 进行压测:
小结
鲲鹏上 Kafka IO 利用率打满的根因是 bfq 调度器对 NVMe SSD 的高并发 IO 不适配,合并排序逻辑增加了额外开销。核心优化点:NVMe SSD 切换 none 调度器让请求直达硬件多队列、降低刷盘频率让 OS 管理缓存、Broker 按 NUMA 节点绑定。建议用 iostat -x 和 perf record -e block:* 定位 IO 热点,确认调度器是否成为瓶颈。
问题描述
在鲲鹏 920 服务器(64 核 / 512GB 内存 / 2TB NVMe SSD)上部署 Kafka 3.6 集群做日志收集,发现 Broker 的磁盘 IO 利用率经常跑到 100%,但实际消息吞吐并不高。用
iostat -x 1观察,NVMe SSD 的 %util 打满,await 飙到 20ms 以上,而 x86 同配置环境下 IO 利用率仅 30% 左右。排查过程
用
perf分析 Kafka Broker 进程的 IO 相关系统调用:大量时间花在
bfq_dispatch_request上。bfq(Budget Fair Queueing)调度器设计初衷是为 SATA HDD 优化顺序 IO,对 NVMe SSD 的高并发随机 IO 反而成为瓶颈——bfq 的合并排序逻辑增加了额外开销。优化方案
第一步:切换 IO 调度器为 none
# NVMe SSD 有硬件多队列,不需要内核调度器做合并排序 echo none > /sys/block/nvme0n1/queue/scheduler # 验证 cat /sys/block/nvme0n1/queue/scheduler # 输出:[none] mq-deadline bfq kyber # 永久生效(写入 udev 规则) cat > /etc/udev/rules.d/60-nvme-scheduler.rules << 'EOF' ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none" EOF udevadm control --reload-rules第二步:优化 Kafka 刷盘配置
第三步:NUMA 感知部署
效果验证
使用
kafka-producer-perf-test进行压测:小结
鲲鹏上 Kafka IO 利用率打满的根因是 bfq 调度器对 NVMe SSD 的高并发 IO 不适配,合并排序逻辑增加了额外开销。核心优化点:NVMe SSD 切换
none调度器让请求直达硬件多队列、降低刷盘频率让 OS 管理缓存、Broker 按 NUMA 节点绑定。建议用iostat -x和perf record -e block:*定位 IO 热点,确认调度器是否成为瓶颈。