Skip to content
极高困难

一句话答案

Kafka 高性能五大因素:顺序写磁盘 + 零拷贝(sendfile)+ 分区并行 + 批量发送 + 消息压缩。

核心要点

Kafka 能达到百万级 TPS,核心依赖三个底层优化:

1. 顺序写磁盘(Sequential Write)

随机写磁盘:磁头每次都要寻道到新位置 → 约 10ms/次 → 100 IOPS
顺序写磁盘:磁头沿磁道连续写 → 约 600MB/s 吞吐
顺序写的速度接近内存随机写(约 1000MB/s)

Kafka 的 Partition 是一个只追加(append-only)的日志文件:
  → 生产者发来的消息追加到文件末尾
  → 永远不修改已写入的内容
  → 纯顺序写,磁盘 IO 极高效

2. PageCache(操作系统页缓存)

Kafka 写消息流程:
  消息 → PageCache(内存)→ 操作系统异步刷盘 → 磁盘

不走 Java 堆内存(避免 JVM GC),直接操作 OS 的 PageCache

好处:
  消费者消费"热数据"时,直接从 PageCache 返回(不读磁盘)
  PageCache 由 OS 管理,进程重启后 PageCache 还在(不像 JVM 堆)

3. 零拷贝(Zero-Copy,sendfile 系统调用)

传统文件发送(4次拷贝,2次上下文切换):
  磁盘 → 内核 PageCache → 用户空间(read)→ Socket Buffer → 网卡(send)

sendfile 零拷贝(2次拷贝,不经过用户空间):
  磁盘 → 内核 PageCache → Socket Buffer → 网卡

Kafka 消费者读取消息时调用 sendfile,数据不需要拷贝到用户空间,
直接从 PageCache 传到网卡,减少 CPU 拷贝开销和上下文切换

其他优化:

  • 批量发送:生产者将多条消息批量打包成一个请求(RecordBatch),减少网络往返
  • 消息压缩:支持 Snappy/LZ4/Zstd 压缩,减少网络传输量
  • Partition 并行:Topic 分为多个 Partition,不同 Partition 并行读写,线性扩展吞吐量
追问与易错

追问方向:

  • 顺序写为什么快?(磁盘顺序 IO 接近内存随机 IO 速度)
  • 零拷贝具体是哪个系统调用?(sendfile,跳过用户态拷贝)
  • Partition 数量越多越好吗?(不是,过多增加选举时间/文件句柄/内存)

易错点:

  • ❌ "Kafka 快是因为内存操作"——Kafka 是磁盘存储,快在顺序写+Page Cache+零拷贝
  • ❌ "增加 Partition 就能线性提升性能"——有上限,过多反而降低

💡 记忆锚点

Kafka快的三板斧:顺序写(像记笔记只往后追加,不翻页涂改)、PageCache(热数据留在OS内存,不走JVM堆免GC)、零拷贝sendfile(数据从磁盘直达网卡,不绕用户态弯路)。再加批量发送和压缩锦上添花。