1.零拷贝(Zero-Copy)技术
Kafka 利用操作系统的零拷贝机制,加速磁盘数据到网络的传输。
核心思想: 减少数据在内核空间、和用户空间之间的不必要拷贝,从而降低 CPU 开销,提高数据传输效率。
普通I/O路径:用户空间 ↔ 内核空间 来回多次拷贝:
- 操作系统将磁盘上的数据拷贝到内核空间的读缓冲区(Read Buffer)。
- 操作系统将内核空间读缓冲区的数据拷贝到用户空间缓冲区(User Buffer)。
- 应用程序将用户空间缓冲区的数据拷贝到内核空间的 Socket 缓冲区(Socket Buffer)。
- 操作系统将内核空间 Socket 缓冲区的数据拷贝到网卡,通过网络发送出去。
在这个过程中,数据经历了四次拷贝,其中两次发生在内核空间和用户空间之间,这会消耗大量的 CPU 资源,尤其是在高并发和大数据量的情况下。
Kafka利用 sendfile()
系统调用,将磁盘数据直接从 页缓存 传输到 socket buffer,避免内核态和用户态之间的数据拷贝。
2.顺序写磁盘
Kafka 的所有消息写入都是顺序写磁盘,避免了随机写的性能瓶颈。
传统的随机写入需要磁盘磁头频繁地移动到不同的扇区,导致大量的寻道时间和旋转延迟,性能较低。
Kafka 将每个 Partition 的消息以追加(append-only)的方式写入到磁盘日志文件的末尾,这是一种纯粹的顺序写入操作。
顺序写入可以充分利用磁盘的吞吐能力,避免了磁头的频繁移动。
极大地提高了写入速度,即使是传统的机械磁盘也能表现出不错的性能。
3.页缓存优化
页缓存(Page Cache)优化:操作系统会将最近访问过的磁盘数据,缓存在内存的页缓存中。
当 Kafka Broker 接收到生产者的消息并将其写入磁盘时,数据也会同时被写入到页缓存。
如果后续有 Consumer 需要读取这些刚刚写入的消息,它们很可能直接从内存的页缓存中读取,而不需要再次进行磁盘 I/O,从而大大提高了读取速度。
即使 Broker 重启,页缓存中的热点数据仍然存在,可以加速恢复后的读取性能。
页缓存是由操作系统管理的,Kafka 无需关心具体的缓存细节,只需要依赖操作系统的优化即可。
4.消息压缩
Kafka 支持多种消息压缩算法(如 Snappy、GZIP、LZ4、ZSTD):
压缩后网络传输数据量更小,提升吞吐;
消息压缩在 Producer 端完成,Broker 端直接存储压缩数据;
消费者解压时也做了优化,解压成本远低于网络延迟。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》