1. I/O本质:两个阶段
阶段一:等待数据就绪(进程阻塞)
阶段二:数据拷贝(内核缓冲区 → 用户缓冲区)
I/O耗时 = 等待时间 + 拷贝时间
2.五种I/O模型对比
| 模型 |
阻塞情况 |
适用场景 |
| 阻塞I/O |
两个阶段都阻塞 |
简单应用 |
| 非阻塞I/O |
不阻塞,需轮询 |
异步框架基础 |
| I/O复用 |
select/poll/epoll |
高并发服务器 |
| 信号驱动 |
SIGIO通知 |
特定场景 |
| 异步I/O |
完全不阻塞 |
io_uring |
3.七大优化方法
| 方法 |
原理 |
提升效果 |
| 增大缓冲区 |
减少系统调用次数 |
2-10x |
| mmap内存映射 |
绕过read/write,直接访问 |
3-5x |
| sendfile零拷贝 |
内核内部文件→socket传输 |
5-20x |
| epoll I/O复用 |
单进程监控多连接 |
10-100x |
| 调整文件系统参数 |
预读/writeback优化 |
2-5x |
| 异步I/O API |
libaio/io_uring |
5-10x |
| 挂载选项优化 |
noatime/directio |
1.5-3x |
4.核心优化层次
应用层:算法+数据结构优化 10-100x
库层:缓冲区+mmap+sendfile 3-20x
系统层:epoll+sysctl 10-100x
内核层:页缓存+零拷贝 5-20x
硬件层:SSD/RAMDISK 10-1000x
5.实战建议
小规模(<100连接) → 阻塞I/O + 合理缓冲区
中等规模(100-1000) → epoll LT模式
大规模(>1000连接) → epoll ET模式 + 非阻塞 + sendfile
关键:I/O优化的核心是减少系统调用次数和减少数据拷贝次数,选择合适的方法取决于具体场景(文件大小、并发量、数据类型)。