最近更新时间:2024-08-09 21:24:38
测试工具
EBS性能测试,推荐使用fio,在centos下,通过以下命令进行安装
sudo yum install libaio -y
sudo yum install libaio-devel
sudo yum install fio -y
参数说明
fio -filename=/dev/vdb -direct=1 -iodepth=32 -thread -rw=write -ioengine=libaio -bs=1m -size=200g -numjobs=1 -runtime=300 -group_reporting -name=test
参数 | 描述 |
---|---|
-filename=/dev/vdb | filename支持文件、裸盘、RBD image,这里是裸盘;如果要测文件系统的话,filename=<具体的文件名>;如果是RBD image,filename=<具体的image name> 该参数可以同时制定多个设备或文件,格式为:-filename=/dev/vdb:/dev/vdc:/dev/vdd(以冒号分割) |
-direct=1 | direct即使用直接写入,绕过操作系统的page cache |
-iodepth=32 | iodepth是设置IO队列深度,即单线程中一次给系统多少IO请求。如果使用同步方式,单线程中iodepth总是1;如果是异步方式,就可以提高iodepth,一次提交一批IO,使得底层IO调度算法可以进行合并操作。异步方式,一般设置为32或64。注意响应时间在可接受的范围内,来增加队列深度,因为队列深度增加了,IO在队列的等待时间也会增加,导致IO响应时间变大,这需要权衡。 单路IO测试设置为1, 多路IO测试设置为32 |
-thread | fio默认是通过fork创建多个job,即多进程方式,如果指定thread,就是用POSIX的thread方式创建多个job,即使用pthread_create()方式创建线程 |
-rw=write | 设置读写模式,包括:write(顺序写)、read(顺序读)、rw(顺序读写)、randwrite(随机写)、randread(随机读)、randrw(随机读写) |
-ioengine=libaio | 设置fio下发I/O的方式,包括sync(同步I/O)、psync(同步I/O,内部使用pwrite、pread方式,和write、read区别是:读写到某个位置,但是不会改变文件位置指针)、libaio(Linux异步I/O,Linux只支持非buffer I/O的异步排队,也就是direct需要设置为1)、posixaio(POSIX异步I/O,是glibc在用户空间实现的,自己维护多个线程进行异步操作,比较耗费资源,扩展性差)、rados(直接使用libaio接口测试RADOS层I/O)、rbd(直接使用librbd接口测试RBD Image I/O)。EBS性能测试使用libaio |
-bs=1m | bs即block size(块大小),是指每个I/O的数据大小。使用场景是数据库的时候,通常采用4k、8k等小数据块,主要关注IOPS指标;使用场景为视频存储、归档等大文件的时候,通常采用1m、4m等大数据块,主要关注带宽吞吐指标。默认情况下,单位小写代表换算基数为1024,大写代表换算基数为1000,即1m=1024k,1M=1000k。随机读写测试设置为4K,顺序读写吞吐测试设置为1M |
-size=200g | 测试总数据量,该参数和runtime会同时限制fio的运行,任何一个目标先达到,fio都会终止运行。我们在做性能测试时,尽量设置大点,比如设置2g、5g、10g或者更大;如果基于文件系统测试,则需要-size需要<4g |
-runtime=300 | 测试总时长,单位是s。和size一起控制fio的运行时长,我们在做一般性性能测试的时候,该时间也尽量设置长点,比如5分钟、10分钟 |
-numjobs=1 | 本次作业同时进行测试的线程或进程数,线程还是进程由前面提到的thread参数控制;EBS性能测试中,numjobs值一般设置为1 |
-group_reporting | 多个jobs测试的时候,测试结果默认是单独分开的,加上这个参数,会将所有jobs的测试结果汇总起来 |
-name=test | 本次测试作业的名称 |
测试结果
1. iops: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=32
2. fio-3.1
3. Starting 1 process
4.
5. iops: (groupid=0, jobs=1): err= 0: pid=2476: Thu Apr 4 14:48:32 2019
6. write: IOPS=19.9k, BW=78.1MiB/s (81.9MB/s)(22.9GiB/300004msec)
7. slat (nsec): min=0, max=1275.7k, avg=4852.31, stdev=3764.04
8. clat (usec): min=413, max=55302, avg=1592.61, stdev=6110.49
9. lat (usec): min=446, max=55305, avg=1598.00, stdev=6110.56
10. clat percentiles (usec):
11. | 1.00th=[ 611], 5.00th=[ 660], 10.00th=[ 685], 20.00th=[ 717],
12. | 30.00th=[ 742], 40.00th=[ 775], 50.00th=[ 799], 60.00th=[ 824],
13. | 70.00th=[ 857], 80.00th=[ 898], 90.00th=[ 971], 95.00th=[ 1057],
14. | 99.00th=[49546], 99.50th=[50594], 99.90th=[51119], 99.95th=[51643],
15. | 99.99th=[51643]
16. bw ( KiB/s): min=47757, max=91609, per=99.97%, avg=79978.20, stdev=677.34, samples=3000
17. iops : min=11939, max=22902, avg=19994.52, stdev=169.35, samples=3000
18. lat (usec) : 500=0.01%, 750=31.87%, 1000=60.41%
19. lat (msec) : 2=5.97%, 4=0.12%, 10=0.03%, 20=0.01%, 50=0.71%
20. lat (msec) : 100=0.89%
21. cpu : usr=3.24%, sys=16.98%, ctx=1538323, majf=0, minf=86
22. IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.0%
23. submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
24. complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
25. issued rwt: total=0,6000032,0, short=0,0,0, dropped=0,0,0
26. latency : target=0, window=0, percentile=100.00%, depth=32
27.
28. Run status group 0 (all jobs):
29. WRITE: bw=78.1MiB/s (81.9MB/s), 78.1MiB/s-78.1MiB/s (81.9MB/s-81.9MB/s), io=22.9GiB (24.6GB), run=300004-300004msec
30.
31. Disk stats (read/write):
32. vdb: ios=61/5998000, merge=0/0, ticks=14/9424113, in_queue=9423702, util=100.00%
行数 | 说明 |
---|---|
Line 1 | fio测试的部分参数信息 |
Line 2 | fio版本 |
Line 3 | fio任务数 |
Line 5 | 分别是分组、线程数、err=0 表示fio线程已成功完成,没有遇到错误,pid表示fio进程ID号 |
Line 6 | 分别是读写模式、IOPS平均值、带宽平均值 (4K随机读写,关注IOPS平均值;1M顺序读写,关注带宽平均值 ) |
Line 7 | slat(submission latency) 提交I/O花费的时间,指从fio创建I/O到内核开始处理I/O的时间,即在队列中排队的时间。当是同步I/O时,该行不显示,因为同步I/O没有队列。本行显示分别是最小延迟、最大延迟、平均延迟、标准方差延迟 |
Line 8 | clat(completion latency)完成I/O花费的时间,从内核开始处理I/O,到I/O处理完成的时间,不包括提交I/O时间。本行显示分别是最小延迟、最大延迟、平均延迟、标准方差延迟 |
Line 9 | 总响应时间,包括slat和clat |
Line 10-15 | IO完成延迟百分比分布,是指该I/O延迟时间的占比情况 |
Line 16 | 带宽的最小值、最大值、本次job占据聚合带宽的百分比(per)、平均值、标准方差值、以及采样点数量 |
Line 17 | IOPS的最小值、最大值、平均值、标准方差值、采样点数量 |
Line 18-20 | I/O响应时间百分比分布,是指I/O响应时间占比情况 |
Line 21 | CPU使用率,分别是:用户态CPU使用率、内核态CPU使用率、上下文切换次数、主要的页面错误数、次要页面错误数 |
Line 22 | I/O深度分布情况,depth需设置成2的N次幂 |
Line 23 | I/O submit分布情况,每一次submit调用提交几个I/O,本示例中4=100%,即表示每次submit调用都是提交4个I/O请求 |
Line 24 | I/O complete分布情况,一次完成多少个I/O请求,本示例中4=100%,即表示每一次完成4个I/O请求,和I/Odepth、submit都有关系 |
Line 28-29 | 这几行是对前面单独测试结果的汇总,包括读写等,分别有带宽(bw)、总I/O数据量(io)、运行时间(run) |
Line 31-32 | 最后列出磁盘使用情况,包括:磁盘名称、总I/O数(ios,以‘/’分割,前面为read ios、后面为write ios)、I/O scheduler合并的I/O数(merge,读合并数/写合并数)、磁盘处理的ticks数(ticks,读使用的ticks/写使用的ticks)、在磁盘队列中花费的总时间(in_queue)、磁盘使用率 |
参考命令
单路IO
随机写
fio -direct=1 -iodepth=1 -rw=randwrite -ioengine=libaio -bs=4k -size=1000G -numjobs=1 -runtime=300 -group_reporting -filename=/dev/vdb -name=Test_4K_RandWrite
随机读
fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -size=1000G -numjobs=1 -runtime=300 -group_reporting -filename=/dev/vdb -name=Test_4K_RandRead
随机混合读写
fio -direct=1 -iodepth=1 -rw=randrw -ioengine=libaio -bs=4k -size=1000G -numjobs=1 -runtime=300 -group_reporting -filename=/dev/vdb -name=Test_4K_RandRW
多路IO
随机写
fio -direct=1 -iodepth=32 -rw=randwrite -ioengine=libaio -bs=4k -size=1000G -numjobs=1 -runtime=300 -group_reporting -filename=/dev/vdb -name=Test_4K_RandWrite
随机读
fio -direct=1 -iodepth=32 -rw=randread -ioengine=libaio -bs=4k -size=1000G -numjobs=1 -runtime=300 -group_reporting -filename=/dev/vdb -name=Test_4K_RandRead
随机混合读写
fio -direct=1 -iodepth=32 -rw=randrw -ioengine=libaio -bs=4k -size=1000G -numjobs=1 -runtime=300 -group_reporting -filename=/dev/vdb -name=Test_4K_RandRW
顺序写吞吐量
fio -direct=1 -iodepth=32 -rw=write -ioengine=libaio -bs=1m -size=1000G -numjobs=1 -runtime=300 -group_reporting -filename=/dev/vdb -name=Test_1m_ReqWrite
顺序读吞吐量
fio -direct=1 -iodepth=32 -rw=read -ioengine=libaio -bs=1m -size=1000G -numjobs=1 -runtime=300 -group_reporting -filename=/dev/vdb -name=Test_1m_ReqRead
顺序混合读写吞吐量
fio -direct=1 -iodepth=32 -rw=rw -ioengine=libaio -bs=1m -size=1000G -numjobs=1 -runtime=300 -group_reporting -filename=/dev/vdb -name=Test_1m_ReqRW
纯净模式