磁盘文件通过收集发送阔别传统式实现
传统方法实现:先读取磁盘、再用 socket 发送,现实也是进过四次 copy buffer = File.read Socket.send(buffer) 这一进程可以类比上边的出产动静: 起首通过体系挪用将文件数据读入到内核态 Buffer(DMA 拷贝) 然后应用措施将内存态 Buffer 数据读入到用户态 Buffer(CPU 拷贝) 接着用户措施通过 Socket 发送数据时将用户态 Buffer 数据拷贝到内核态 Buffer(CPU 拷贝) 最后通过 DMA 拷贝将数据拷贝到 NIC Buffer Linux 2.4+ 内核通过 sendfile 体系挪用,提供了零拷贝。数据通过 DMA 拷贝到内核态 Buffer 后,直接通过 DMA 拷贝到 NIC Buffer,无需 CPU 拷贝。这也是零拷贝这一说法的来历。除了镌汰数据拷贝外,由于整个读文件 - 收集发送由一个 sendfile 挪用完成,整个进程只有两次上下文切换,因此大大进步了机能。 Kafka 在这里回收的方案是通过 NIO 的 transferTo/transferFrom 挪用操纵体系的 sendfile 实现零拷贝。总共产生 2 次内核数据拷贝、2 次上下文切换和一次体系挪用,消除了 CPU 数据拷贝 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |