Linux 如何查看与测试磁盘 IO 性能
Linux 如何查看与测试磁盘 IO 性能
1. 使用 fio
测试 IO 性能
-
安装 2:
sudo apt install -y fio
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 每个进程生成文件的数量