1. read+write (4 次拷贝)vs sendfile(2 次拷贝)
点 开始 看动画。每条「箭头」高亮表示一次数据流动;红色拷贝吃 CPU,蓝色 DMA 不吃 CPU。
传统 read + write(4 次拷贝 + 2 次切换)
用户空间:app buffer
↑ [CPU 拷贝 3] user buffer → socket buffer
↑ [CPU 拷贝 2] PageCache → user buffer
内核空间:PageCache & socket buffer
↑ [DMA 拷贝 1] disk → PageCache
↑ [DMA 拷贝 4] socket buffer → NIC
硬件:磁盘 + 网卡
CPU 拷贝 ×2
DMA 拷贝 ×2
上下文切换 ×2
sendfile(2 次 DMA 拷贝 + 1 次切换)
用户空间:仅触发 sendfile() 调用
(数据不进用户态)
内核空间:PageCache
↑ [DMA 拷贝 1] disk → PageCache
↑ [DMA 拷贝 2] PageCache → NIC(gather)
硬件:磁盘 + 网卡
CPU 拷贝 ×0
DMA 拷贝 ×2
上下文切换 ×1
控制
就绪对比表
| 方式 | DMA 拷贝 | CPU 拷贝 | 总拷贝 | 上下文切换 | 系统调用 |
|---|---|---|---|---|---|
| read + write | 2 | 2 | 4 | 2 | 2 |
| sendfile (pre 2.4) | 2 | 1 | 3 | 1 | 1 |
| sendfile + DMA gather (2.4+) | 2 | 0 | 2 | 1 | 1 |
2. HDD 顺序写 vs 随机写:磁头移动的差距
模拟 HDD 上写 30 个 4KB 块。顺序写:磁头沿一条轨道前进;随机写:磁头每次都要寻道。
顺序写
耗时:0 ms
吞吐:0 MB/s
吞吐:0 MB/s
随机写
耗时:0 ms
吞吐:0 MB/s
吞吐:0 MB/s
控制
3. PageCache 命中 vs Miss 对吞吐的影响
调整 Consumer 的「读热数据 vs 读冷数据」比例,观察吞吐变化。
PageCache 命中率
-
%
综合吞吐
-
MB/s
对比 100% Miss
-
x
命中率柱状图
* Miss 时数据要从磁盘走 sendfile,速度受限于磁盘 IO。
* Hit 时数据已在 PageCache 中,速度受限于内存带宽和网络。
4. batch.size / linger.ms / compression 对吞吐 / 延迟的影响
基于经验模型实时计算。三参数交互动手感受 Producer 端最常调的「吞吐/延迟」三角关系。
吞吐
-
MB/s
p99 延迟
-
ms
CPU 占用
-
%
batch 平均大小
-
单 batch 消息数
-