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);