磁盘:读写压测

1. 基本磁盘测试方法

1.1 纯写入速度测试

1
2
3
4
5
6
7
8
9
10
11
# 测试/data目录所在磁盘的纯写速度
time dd if=/dev/zero of=/var/test bs=8k count=1000000

# 示例输出:
1000000+0 records in
1000000+0 records out
8192000000 bytes (8.2 GB) copied, 52.5749 seconds, 156 MB/s

real 0m55.841s
user 0m0.507s
sys 0m15.706s

1.2 纯读取速度测试

1
2
3
4
5
6
7
8
9
10
11
# 测试/data目录所在磁盘的纯读速度
time dd if=/var/test of=/dev/null bs=8k count=1000000

# 示例输出:
1000000+0 records in
1000000+0 records out
8192000000 bytes (8.2 GB) copied, 49.0088 seconds, 167 MB/s

real 0m49.025s
user 0m0.559s
sys 0m6.383s

1.3 读写同时测试

1
2
3
4
5
6
7
8
9
10
11
# 测试读写速度
time dd if=/var/test of=/tmp/test bs=8k count=1000000

# 示例输出:
125000+0 records in
125000+0 records out
8192000000 bytes (8.2 GB) copied, 129.239 seconds, 63.4 MB/s

real 2m9.251s
user 0m0.114s
sys 0m21.494s

2. 专业工具测试方法

2.1 使用 hdparm 测试读速度

1
2
3
4
5
6
7
8
9
# 安装hdparm(如未安装)
yum install hdparm -y

# 测试IO读速度(绕过缓存)
hdparm -t --direct /dev/sda1

# 示例输出:
/dev/sda1:
Timing O_DIRECT disk reads: 163 MB in 3.00 seconds = 54.33 MB/sec

2.2 多种写入测试方法

1
2
3
4
5
6
7
8
9
10
# 基本写入测试
time dd if=/dev/zero bs=1024 count=1000000 of=/1Gb.file

# 精确时间测量写入(1MB块大小,20GB文件)
sync;/usr/bin/time -p bash -c "(dd if=/dev/zero of=test.dd bs=1M count=20000)"

# 示例输出:
20000+0 records in
20000+0 records out
20971520000 bytes (21 GB) copied, 168.32 s, 125 MB/s

3. 测试结果分析

3.1 典型测试结果对比

测试类型 速度 备注
磁盘缓存读 7471 MB/s 内存缓存速度
直接磁盘读 163 MB/s 绕过缓存的实际磁盘速度
IO写入 125 MB/s 顺序写入速度
IO读取 206 MB/s 顺序读取速度

3.2 测试注意事项

  1. 块大小影响:通过 bs 选项设置不同的读写块大小(默认512字节,推荐使用1M)
  2. 系统干扰:测试结果可能受到系统中有IO读写进程的影响
  3. 多次测试:相同命令多次测试结果可能有差异,建议取平均值
  4. 测试环境:明确测试是在什么样的环境下获得的(是否有多任务运行)

4. 测试结论与建议

  1. 工具选择

    • 读测试推荐使用 hdparm(更准确)
    • 写测试推荐使用 dd 并配合 time 命令
  2. 性能分析

    1
    2
    3
    4
    5
    graph LR
    A[测试方法] --> B[顺序读写]
    A --> C[随机读写]
    B --> D[高吞吐量]
    C --> E[低延迟]
  3. 影响因素

    • 读写方式(顺序/随机)
    • 系统缓存机制
    • 磁盘类型(HDD/SSD/NVMe)
    • 测试数据取样大小
  4. 最佳实践

    1
    2
    3
    4
    5
    # 推荐的综合测试流程
    hdparm -t --direct /dev/sda1 # 测试直接读
    sync; dd if=/dev/zero of=tempfile bs=1M count=2048; sync # 测试写入
    dd if=tempfile of=/dev/null bs=1M # 测试读取
    rm -f tempfile # 清理测试文件

注意:所有测试都应使用root用户执行,测试完成后请及时删除生成的测试文件,避免占用磁盘空间。