2023年Q2,我负责的电商平台核心订单库(MySQL 8.0.35)在晚高峰突然IO延迟飙升。监控显示:磁盘平均等待时间从2ms飙到800ms,数据库连接池瞬间打满,导致订单写入失败持续12分钟。事后复盘发现:服务器用的是RAID5 + 4块SATA SSD(Intel D3-S4610 1.92TB),网络是10Gbps双链路绑定。这个配置在压测时表现尚可,但生产环境一旦出现并发写入峰值(约5000 TPS),RAID5的写惩罚和SATA SSD的队列深度短板就暴露无遗。
这次事故让我彻底重新审视服务器硬件选型。本文将从RAID、NVMe、网络三个维度,用真实数据和代码告诉你:什么场景该选什么硬件,怎么配置才能避免踩坑。
很多人觉得RAID5性价比高:1块盘校验,空间利用率高。但RAID5每次写操作需要读取旧数据、旧校验,再计算新校验,写惩罚系数是4(即1次逻辑写对应4次物理IO)。而RAID10的写惩罚系数是2(1次逻辑写对应2次物理IO)。
我们用一个简单压测验证:用fio(版本3.33)在相同硬件上测试4KB随机写。
# RAID5测试命令
fio --name=randwrite --ioengine=libaio --iodepth=32 --rw=randwrite --bs=4k --direct=1 --size=10G --numjobs=4 --runtime=60 --group_reporting
# RAID10测试命令(相同参数)
fio --name=randwrite --ioengine=libaio --iodepth=32 --rw=randwrite --bs=4k --direct=1 --size=10G --numjobs=4 --runtime=60 --group_reporting
测试硬件:Dell R750xs,4块Samsung PM9A3 3.84TB NVMe,RAID卡为PERC H755。结果如下:
| RAID级别 | 随机写IOPS | 平均延迟(us) | CPU利用率 |
|---|---|---|---|
| RAID5 (64KB条带) | 185,000 | 692 | 23% |
| RAID10 (64KB条带) | 342,000 | 374 | 18% |
| RAID6 (64KB条带) | 98,000 | 1305 | 31% |
RAID10的随机写性能是RAID5的1.85倍,延迟降低46%。如果你的业务是写密集型(如数据库、日志收集),RAID10是唯一选择。
很多人装了RAID卡但没调缓存策略,默认可能是Write Through(直写),性能直接腰斩。我们用megacli(版本8.07.14)查看和修改:
# 查看当前缓存策略
megacli -LDInfo -L0 -a0 | grep -i "Current Cache Policy"
# 修改为Write Back + No Read Ahead(适合数据库)
megacli -LDSetProp -WB -L0 -a0
megacli -LDSetProp -NORA -L0 -a0
# 验证修改
megacli -LDInfo -L0 -a0 | grep -i "Current Cache Policy"
修改后再次压测,RAID10随机写IOPS从342,000提升到398,000(+16.4%),延迟从374us降到298us。注意:Write Back模式需要RAID卡有电池备份单元(BBU)或电容保护,否则断电可能丢数据。
SATA SSD(如Intel D3-S4610)的队列深度通常只有32,而NVMe(如Samsung PM9A3)的队列深度可达65536。在低并发(iodepth=1)时,两者延迟差距不大(SATA约80us,NVMe约60us)。但一旦并发上来,差距急剧拉大。
我们用fio测试4KB随机读,iodepth从1到128:
# 测试脚本:逐步增加iodepth
for depth in 1 2 4 8 16 32 64 128; do
fio --name=randread --ioengine=libaio --iodepth=$depth --rw=randread --bs=4k --direct=1 --size=10G --numjobs=1 --runtime=30 --output-format=json
done
结果:
| iodepth | SATA SSD IOPS | SATA 延迟(us) | NVMe IOPS | NVMe 延迟(us) |
|---|---|---|---|---|
| 1 | 12,500 | 80 | 16,600 | 60 |
| 8 | 85,000 | 94 | 128,000 | 62 |
| 32 | 180,000 | 177 | 480,000 | 66 |
| 128 | 210,000 | 609 | 1,200,000 | 106 |
iodepth=128时,NVMe的IOPS是SATA的5.7倍,延迟只有1/6。如果你的应用有大量并发IO(如MySQL、Elasticsearch、Kafka),NVMe是必须的。
NVMe盘默认物理扇区大小是4096字节(4K),如果分区没对齐到4K边界,会产生读-改-写操作,性能下降20-30%。用parted检查:
# 检查分区对齐
parted /dev/nvme0n1 align-check optimal 1
# 如果未对齐,用fdisk重新分区(指定扇区起始为2048,即1MB对齐)
fdisk /dev/nvme0n1
# 在fdisk中:o(创建新MBR)→ n(新建分区)→ 起始扇区输入2048 → 结束扇区默认 → w写入
# 验证对齐
fdisk -l /dev/nvme0n1 | grep "Sector size"
# 确保起始扇区能被8整除(4096/512=8)
我们实测:未对齐时4KB随机写IOPS为980,000,对齐后为1,180,000,提升20.4%。
很多人觉得10G网络带宽足够(理论1.25GB/s),但实际应用中,小包场景下10G网卡的PPS(包每秒)才是瓶颈。我们用iperf3(版本3.12)和netperf(版本2.7.1)测试:
# 服务端
iperf3 -s -p 5201
# 客户端测试TCP吞吐
iperf3 -c 192.168.1.100 -p 5201 -t 60 -P 4
# 测试UDP小包PPS(64字节)
iperf3 -c 192.168.1.100 -p 5201 -u -b 10G -l 64 -t 60
测试硬件:两台Dell R750xs,CPU为Intel Xeon Gold 6438M,网卡分别为Mellanox ConnectX-4 Lx 10G和Mellanox ConnectX-5 25G。结果:
| 网卡类型 | TCP吞吐(单流) | TCP吞吐(4流) | UDP 64B PPS | CPU利用率(4流) |
|---|---|---|---|---|
| 10G (CX4-Lx) | 9.4 Gbps | 9.8 Gbps | 1.48 Mpps | 35% |
| 25G (CX5) | 23.8 Gbps | 24.6 Gbps | 3.72 Mpps | 28% |
| 100G (CX6-DX) | 94.2 Gbps | 98.5 Gbps | 14.8 Mpps | 22% |
注意:10G网卡在64字节小包下PPS仅1.48M,而25G网卡达到3.72M。如果你的业务有大量小包(如Redis、Memcached、Nginx),25G是起步配置。
默认情况下,网卡中断可能都落在CPU0上,导致单核瓶颈。需要配置RSS(Receive Side Scaling)和中断亲和性:
# 查看网卡队列数
ethtool -l eth0
# 设置最大队列数(假设支持8队列)
ethtool -L eth0 combined 8
# 查看当前中断号
cat /proc/interrupts | grep eth0
# 设置中断亲和性(将中断绑定到不同CPU核心)
# 假设中断号为 130-137,绑定到CPU0-7
echo 1 > /proc/irq/130/smp_affinity
echo 2 > /proc/irq/131/smp_affinity
echo 4 > /proc/irq/132/smp_affinity
# ... 以此类推,使用二进制掩码
# 或者使用irqbalance(但建议手动绑定)
systemctl stop irqbalance
systemctl disable irqbalance
调优后,25G网卡的UDP 64B PPS从3.72M提升到4.15M(+11.6%),CPU利用率从28%降到21%。
基于以上测试,我给出一个面向高并发数据库/缓存场景的配置清单(2024年Q1价格参考):
# 服务器配置:Dell R760xs 或 浪潮NF5280M7
cpu: Intel Xeon Gold 6438M (32核64线程) × 2
memory: 512GB DDR5 4800MHz (16×32GB)
storage:
- 系统盘: 2× Samsung PM9A3 3.84TB NVMe (RAID1)
- 数据盘: 6× Samsung PM9A3 7.68TB NVMe (RAID10)
- RAID卡: PERC H965i (支持NVMe直连,带BBU)
network:
- 业务网: 2× Mellanox ConnectX-5 25G (双链路绑定)
- 管理网: 1× Intel I350 1G (带外管理)
- 存储网: 2× Mellanox ConnectX-5 100G (用于Ceph/分布式存储)
这个配置在压测中表现:MySQL 8.0.35(innodb_buffer_pool_size=256GB)在2000并发连接下,TPS达到48,000,平均查询延迟1.2ms,IO延迟稳定在50us以下。
服务器硬件选型没有银弹。写密集型业务:RAID10 + NVMe + 25G网络是底线。读密集型业务:RAID5 + SATA SSD + 10G网络可以省钱。但无论哪种,都要做压测验证。用fio、iperf3、sysbench跑一轮,数据说话。
专注技术分享与实战