磁盘顺序读写性能远高于随机读写,核心在于机械硬盘需频繁寻道与旋转延迟,固态硬盘则受限于并行通道调度与页读取粒度;顺序访问关注吞吐量(mb/s),随机访问侧重iops(如4k),二者指标不可直接比较。

磁盘随机读写和顺序读写的性能差异,核心在于物理寻道开销——顺序访问时磁头(或SSD的逻辑页连续映射)移动少、延迟低;随机访问则频繁换道或跨块寻址,IOPS受限明显。分析这个差异,不能只看一个数字,而要分场景测、对指标看、用对工具。
先搞清关键指标怎么选
顺序读写关注吞吐量(MB/s):大块连续搬运能力,比如视频流、备份场景;
随机读写关注IOPS(每秒IO次数):尤其4K小块,反映数据库、虚拟机等高并发小请求的响应能力。
同一块盘,顺序读可能达500 MB/s,但4K随机读可能只有2万 IOPS(约80 MB/s),数值不可直接比。
用 dd 快速验证顺序性能(带绕缓存)
适合粗略判断持续吞吐上限,但仅限顺序场景:
• 写测试(清缓存 + 直接IO):
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'; dd if=/dev/zero of=/mnt/testfile bs=1M count=2048 oflag=direct
• 读测试(同样清缓存):
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'; dd if=/mnt/testfile of=/dev/null bs=1M iflag=direct
注意:必须加 oflag=direct 或 iflag=direct,否则测的是内存缓存速度;bs=1M 比默认512B更贴近真实大文件行为。
用 fio 模拟真实随机/顺序负载
fio 是唯一能准确区分两类行为的工具,参数需匹配业务特征:
• 顺序读(2GB,1MB块):
fio --name=seqread --ioengine=libaio --rw=read --bs=1M --size=2G --direct=1 --filename=/mnt/testfile
• 4K 随机读(模拟数据库查询):
fio --name=randread --ioengine=libaio --rw=randread --bs=4k --size=1G --numjobs=16 --iodepth=32 --direct=1 --group_reporting
关键点:
– --rw=randread 或 --rw=read 明确指定模式
– --bs=4k 对应随机,--bs=1M 对应顺序
– --iodepth 控制队列深度,SSD建议32–64,机械盘可设低些
– 加 --group_reporting 合并多线程结果,避免单线程误导
运行中观察差异:iostat 看实际负载表现
不压测时也能发现瓶颈,每2秒刷新一次:
iostat -x 2
重点关注字段:
• %util:接近100%说明设备忙,但NVMe下该值参考性下降
• await:平均IO等待毫秒数,随机负载下若持续>10ms(SSD)或>15ms(HDD),说明响应已吃紧
• r/s 和 w/s:对应IOPS,随机场景下这个值比 MB/s 更有诊断意义
• rkB/s 和 wkB/s:对应吞吐量,顺序场景下看这个更准
配合 iotop 可定位哪个进程在发起大量随机IO(如MySQL的buffer pool刷脏页)











