服务器磁盘 IO 性能优化指南
一、RAID 级别选型
RAID 级别直接影响磁盘的读写性能和容错能力:
RAID 0
- 原理:数据条带化($D = D_1 \\oplus D_2 \\oplus \\cdots \\oplus D_n$)
- 优势:读写速度最快(理论值 $S_{\\text{read}} = n \\times S_{\\text{disk}}$)
- 缺点:无冗余,单盘故障导致数据全损
- 适用场景:临时数据处理/日志服务器
RAID 10
- 原理:镜像+条带化($D = (D_{a1} \\parallel D_{b1}) \\oplus (D_{a2} \\parallel D_{b2})$)
- 优势:读写性能优异,支持 $n/2$ 盘故障
- 缺点:磁盘利用率仅 50%
- 适用场景:数据库/虚拟化平台
RAID 5/6
- 原理:分布式校验($P = D_1 \\oplus D_2 \\oplus \\cdots \\oplus D_{n-1}$)
- 优势:平衡性能与容量(利用率 $1-1/n$)
- 缺点:写性能受校验计算拖累
- 选型建议:
- RAID 5:适合读密集型业务
- RAID 6:高可靠性需求场景
决策矩阵:
$$ \\begin{cases} \\text{性能优先} & \\rightarrow \\text{RAID 0/10} \\ \\text{容量优先} & \\rightarrow \\text{RAID 5} \\ \\text{容灾优先} & \\rightarrow \\text{RAID 6/10} \\end{cases} $$
二、IO 调度算法调整
Linux 内核调度算法直接影响 IO 请求处理效率:
| noop | 简单FIFO队列 | SSD/云虚拟化环境 |
| deadline | 分读/写队列+超时机制 | 混合负载数据库 |
| cfq | 按进程分配时间片 | 多用户桌面系统 |
| kyber | 深度队列分层管理 | NVMe 高速存储 |
优化步骤:
cat /sys/block/sda/queue/scheduler
echo deadline > /sys/block/sda/queue/scheduler
在 /etc/default/grub 添加 elevator=deadline
三、缓存配置策略
1. 操作系统级缓存
- Page Cache:
通过调节 vm.dirty_ratio(默认20%)控制脏页刷新阈值:sysctl -w vm.dirty_ratio=10 # 降低写延迟
- Direct IO:
绕过缓存直接读写,适合自建缓存的数据库:open(file, O_DIRECT); // C语言示例
2. 磁盘控制器缓存
- Write-Back Cache:
- 原理:数据先写入缓存再异步落盘
- 风险:需配合BBU防止断电丢数据
- Read-Ahead:
调整预读大小提升顺序读性能:blockdev –setra 8192 /dev/sda # 设置8MB预读
3. 应用层缓存
- 数据库:调整 InnoDB Buffer Pool (MySQL)
- 文件系统:XFS 对大文件更友好
综合优化建议
- iostat -x 1 观察 $ \\text{%util} > 80% $ 的磁盘
- iotop 定位高IO进程
- 数据库服务器:RAID 10 + deadline + 32GB Buffer Pool
- 视频存储:RAID 6 + XFS + 大预读值
- RAID 5 避免使用 SMR 磁盘
- Write-Back 必须启用 BBU 保护
- 虚拟机环境优先选用 noop 调度器
最终性能提升公式:
$$ \\Delta P = k_{\\text{raid}} \\times \\eta_{\\text{sched}} \\times \\sqrt{C_{\\text{cache}}} $$ 其中 $k_{\\text{raid}}$ 为RAID系数,$ \\eta_{\\text{sched}} $ 为调度效率,$ C_{\\text{cache}} $ 为缓存命中率。

