欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

Kafka 零拷贝实现原理:mmap 与 sendfile 的性能跃迁

发表于:|最后更新:|分类:消息队列与存储|阅读:6748 次

Apache Kafka 之所以拥有单机十万级吞吐量,核心在于利用了 Linux 内核的 零拷贝(Zero-Copy) 技术。索引文件使用 mmap 映射内存,而消息日志的消费直接调用 sendfile 系统调用完成 DMA 传输,避免了上下文切换与内核到用户态的内存复制。

一、Java 中的 FileChannel.transferTo 零拷贝

java
// Java NIO 底层对应 Linux 的 sendfile() 系统调用
FileChannel fileChannel = new FileInputStream("data.log").getChannel();
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("10.0.0.2", 9092));

// 数据直接在内核缓冲区流转并通过网卡发送,绕过 JVM 用户态内存
fileChannel.transferTo(position, count, socketChannel);