加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

磁盘文件通过网络发送远离传统式实现

发布时间:2021-05-22 18:36:50 所属栏目:教程 来源:互联网
导读:传统方式实现:先读取磁盘、再用 socket 发送,实际也是进过四次 copy buffer=File. read Socket.send(buffer) 这一过程可以类比上边的生产消息: 首先通过系统

传统方式实现:先读取磁盘、再用 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 数据拷贝

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读