外观
一句话答案
Kafka 高性能五大因素:顺序写磁盘 + 零拷贝(sendfile)+ 分区并行 + 批量发送 + 消息压缩。
核心要点
Kafka 能达到百万级 TPS,核心依赖三个底层优化:
1. 顺序写磁盘(Sequential Write)
随机写磁盘:磁头每次都要寻道到新位置 → 约 10ms/次 → 100 IOPS
顺序写磁盘:磁头沿磁道连续写 → 约 600MB/s 吞吐
顺序写的速度接近内存随机写(约 1000MB/s)
Kafka 的 Partition 是一个只追加(append-only)的日志文件:
→ 生产者发来的消息追加到文件末尾
→ 永远不修改已写入的内容
→ 纯顺序写,磁盘 IO 极高效1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
2. PageCache(操作系统页缓存)
Kafka 写消息流程:
消息 → PageCache(内存)→ 操作系统异步刷盘 → 磁盘
不走 Java 堆内存(避免 JVM GC),直接操作 OS 的 PageCache
好处:
消费者消费"热数据"时,直接从 PageCache 返回(不读磁盘)
PageCache 由 OS 管理,进程重启后 PageCache 还在(不像 JVM 堆)1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
3. 零拷贝(Zero-Copy,sendfile 系统调用)
传统文件发送(4次拷贝,2次上下文切换):
磁盘 → 内核 PageCache → 用户空间(read)→ Socket Buffer → 网卡(send)
sendfile 零拷贝(2次拷贝,不经过用户空间):
磁盘 → 内核 PageCache → Socket Buffer → 网卡
Kafka 消费者读取消息时调用 sendfile,数据不需要拷贝到用户空间,
直接从 PageCache 传到网卡,减少 CPU 拷贝开销和上下文切换1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
其他优化:
- 批量发送:生产者将多条消息批量打包成一个请求(RecordBatch),减少网络往返
- 消息压缩:支持 Snappy/LZ4/Zstd 压缩,减少网络传输量
- Partition 并行:Topic 分为多个 Partition,不同 Partition 并行读写,线性扩展吞吐量
追问与易错
追问方向:
- 顺序写为什么快?(磁盘顺序 IO 接近内存随机 IO 速度)
- 零拷贝具体是哪个系统调用?(sendfile,跳过用户态拷贝)
- Partition 数量越多越好吗?(不是,过多增加选举时间/文件句柄/内存)
易错点:
- ❌ "Kafka 快是因为内存操作"——Kafka 是磁盘存储,快在顺序写+Page Cache+零拷贝
- ❌ "增加 Partition 就能线性提升性能"——有上限,过多反而降低
💡 记忆锚点
Kafka快的三板斧:顺序写(像记笔记只往后追加,不翻页涂改)、PageCache(热数据留在OS内存,不走JVM堆免GC)、零拷贝sendfile(数据从磁盘直达网卡,不绕用户态弯路)。再加批量发送和压缩锦上添花。