Operation

Linux 如何查看与测试磁盘 IO 性能

Linux 如何查看与测试磁盘 IO 性能

1. 使用 fio 测试 IO 性能

1.1 用法示例

# 测试挂载点 /mnt/disk1 的磁盘顺序读
sudo fio -filename=/mnt/disk1/fio_seq_r.testing -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=fio_seq_r

# 测试挂载点 /mnt/disk1 的磁盘顺序写
sudo fio -filename=/mnt/disk1/fio_seq_w.testing -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=fio_seq_w

# 测试挂载点 /mnt/disk1 的磁盘随机读
sudo fio -filename=/mnt/disk1/fio_rand_r.testing -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=fio_rand_r

# 测试挂载点 /mnt/disk1 的磁盘随机写
sudo fio -filename=/mnt/disk1/fio_rand_w.testing -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=fio_rand_w

# 测试挂载点 /mnt/disk1 的混合随机读写
sudo fio -filename=/mnt/disk1/fio_rand_rw.testing -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -ioscheduler=noop -name=fio_rand_rw

1.2 以实际拷贝文件 vs 顺序读写的测试为例

[root@cn-south1-web1 apps]# du -sh testdata.zip
12G    testdata.zip
[root@cn-south1-web1 apps]# date; cp testdata.zip  testdata.zip.2; date
Tue 12 Oct 2021 01:53:15 PM CST
Tue 12 Oct 2021 01:53:59 PM CST
sudo fio -filename=/mnt/disk1/fio_seq_w.testing -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=fio_seq_w

fio_seq_w: (g=0): rw=write, bs=(R) 16.0KiB-16.0KiB, (W) 16.0KiB-16.0KiB, (T) 16.0KiB-16.0KiB, ioengine=psync, iodepth=1
...
fio-3.16
Starting 10 threads
Jobs: 10 (f=10): [W(10)][100.0%][w=193MiB/s][w=12.3k IOPS][eta 00m:00s]
fio_seq_w: (groupid=0, jobs=10): err= 0: pid=57022: Tue Oct 12 12:35:01 2021
  write: IOPS=12.6k, BW=196MiB/s (206MB/s)(11.5GiB/60001msec); 0 zone resets
    clat (usec): min=56, max=6971, avg=794.26, stdev=411.60
     lat (usec): min=56, max=6972, avg=794.70, stdev=411.64
    clat percentiles (usec):
     |  1.00th=[   70],  5.00th=[   72], 10.00th=[   74], 20.00th=[  742],
     | 30.00th=[  775], 40.00th=[  791], 50.00th=[  807], 60.00th=[  832],
     | 70.00th=[  914], 80.00th=[ 1074], 90.00th=[ 1237], 95.00th=[ 1434],
     | 99.00th=[ 1811], 99.50th=[ 1942], 99.90th=[ 2278], 99.95th=[ 2474],
     | 99.99th=[ 4817]
   bw (  KiB/s): min=151392, max=364096, per=100.00%, avg=201015.63, stdev=3211.98, samples=1194
   iops        : min= 9462, max=22756, avg=12563.24, stdev=200.75, samples=1194
  lat (usec)   : 100=17.94%, 250=0.09%, 500=0.01%, 750=3.47%, 1000=53.29%
  lat (msec)   : 2=24.82%, 4=0.37%, 10=0.02%
  cpu          : usr=0.38%, sys=4.82%, ctx=1507892, majf=0, minf=0
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,753715,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: bw=196MiB/s (206MB/s), 196MiB/s-196MiB/s (206MB/s-206MB/s), io=11.5GiB (12.3GB), run=60001-60001msec

Disk stats (read/write):
  sda: ios=0/752491, merge=0/0, ticks=0/48941, in_queue=0, util=99.87%

*从操作结果得出:直接拷贝文件 12G 1024 / 48 sec = 256 MB/sec,而使用 fio 顺序写测试显示 (206MB/s)(11.5GiB/60001msec) 基本接近但还是有些误差,影响因素可能因为 cp 是读写混合操作、还有 OS Buffer/Cached 等**

  • fio 参数列表
filename=/dev/emcpowerb 支持文件系统或者裸设备,-filename=/dev/sda2或-filename=/dev/sdb
direct=1                 测试过程绕过机器自带的buffer,使测试结果更真实
rw=randwread             测试随机读的I/O
rw=randwrite             测试随机写的I/O
rw=randrw                测试随机混合写和读的I/O
rw=read                  测试顺序读的I/O
rw=write                 测试顺序写的I/O
rw=rw                    测试顺序混合写和读的I/O
bs=4k                    单次io的块文件大小为4k
bsrange=512-2048         同上,提定数据块的大小范围
size=5g                  本次的测试文件大小为5g,以每次4k的io进行测试
numjobs=30               本次的测试线程为30
runtime=1000             测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止
ioengine=psync           io引擎使用pync方式,如果要使用libaio引擎,需要yum install libaio-devel包
rwmixwrite=30            在混合读写的模式下,写占30%
group_reporting          关于显示结果的,汇总每个进程的信息
此外
lockmem=1g               只使用1g内存进行测试
zero_buffers             用0初始化系统buffer
nrfiles=8                每个进程生成文件的数量

留言

您的电子邮箱地址不会被公开。