整个过程如下:

文章插图
此时便是零拷贝(Zero-copy)技术的终极形态,因为我们没有在内存层面去拷贝数据 , 也就是说全程没有通过 CPU 来搬运数据,所有的数据都是通过 DMA 来进行传输的 。
使用零拷贝技术只需要两次上下文切换和数据拷贝,就可以完成文件的传输,因为它通过一次系统调用(sendfile 方法)将磁盘读取与网络发送两个操作给合并了,从而降低了上下文切换次数 。而且两次的数据拷贝过程也不需要通过 CPU,都是由 DMA 来搬运 。所以总体来看,零拷贝技术可以把文件传输的性能提高至少一倍以上 。
但需要注意的是,零拷贝技术不允许进程对文件内容作进一步加工,比如压缩数据再发送 。如果希望对读取的文件内容做额外的操作,那么就只能拷贝到用户空间了 。
另外当传输大文件时,不建议使用零拷贝 , 因为 PageCache 可能被大文件占据,而导致「热点」小文件无法利用到 PageCache,并且大文件的缓存命中率也不高 , 因此这种情况建议绕过 PageCache 。
使用 PageCache 的 IO 叫做缓存 IO,不使用 PageCache 的 IO 叫做直接 IO 。
小结以上我们就探讨了 Kafka 为什么会有如此高的吞吐量,在处理海量数据时为什么这么快 。核心就在于以下几点:
1)消息是以 "批" 为单位的 。
2)利用磁盘的顺序读写远远快于随机读写 。
3)使用 PageCache 。
4)使用零拷贝技术 。
推荐阅读
- 八个提升编程体验的VS Code插件
- Python的集合模块,使用数据容器处理数据集合
- 基于Kubernetes网关API策略的流量管理
- 深入理解实践场景下的DNS隧道通信
- RabbitMQ发送和接收消息的几种方式
- 一文搞定双链表,让你彻底弄懂线性表的链式实现
- 不吃饭也要掌握的Synchronized锁升级过程
- Java中的泛型,看完这个还不会,我倒立洗头!
- Springboot之把外部依赖包纳入Spring容器管理的两种方式
- 探索Java的HTTP请求与响应处理机制
