编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

磁盘性能好不好,IOPS回答你,fio探测iops有多高!

wxchong 2024-09-07 01:35:08 开源技术 9 ℃ 0 评论

IOPS(Input/Output Per Second)即每秒磁盘的读写次数,是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请求通常为读或写数据操作请求。

想要知道磁盘的IOPS有多高,可以使用fio工具测试!

FIO是测试IOPS的非常好的工具,用来对磁盘进行压力测试和验证。磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类。FIO是一个可以产生很多线程或进程并执行用户指定的特定类型I/O操作的工具,FIO的典型用途是编写和模拟的I/O负载匹配的作业文件。也就是说FIO 是一个多线程io生成工具,可以生成多种IO模式,用来测试磁盘设备的性能(也包含文件系统:如针对网络文件系统 NFS 的IO测试)。

Fio(Flexible I/O Tester)是一款由Jens Axboe开发的用于测评和压力/硬件验证的自由开源的软件。它支持[sync、mmap、libaio、posixaio、SG v3、splice、null、network、 syslet、guasi、solarisaio] 等19 种不同类型的 I/O 引擎测试。Fio 接受一种非常简单易于理解的文本格式的任务描述。软件默认包含了几个示例任务文件。 Fio 展示了所有类型的 I/O 性能信息,包括完整的 IO 延迟和百分比。

磁盘测试工具 FIO 安装和使用方法

fio可以通过源码安装、rpm包安装以及yum安装;

  • 源码安装方式
官网地址:http://freecode.com/projects/fio/
github 地址:https://github.com/axboe/fio

wget https://github.com/axboe/fio/archive/refs/tags/fio-3.14.tar.gz
tar -zxvf fio-3.14.tar.gz
./configure
make
make install
  • rpm包安装

官网地址:https://pkgs.org/download/fio

rpm 包:http://mirror.centos.org/centos/7/os/x86_64/Packages/fio-3.7-2.el7.x86_64.rpm

wget http://mirror.centos.org/centos/7/os/x86_64/Packages/fio-3.7-2.el7.x86_64.rpm
yum install libaio-devel
yum install libibverbs -y
yum install libpmem -y
yum install librados2 -y
yum install librbd1
rpm -ivh fio-3.7-2.el7.x86_64.rpm


  • yum安装:

yum install fio

fio使用参数说明

-filename=/dev/sdb1    /*测试文件名称,通常选择需要测试的盘的data目录。*/
-filename /*定义测试文件(设备)的名称。此处选择文件,则代表测试文件系统的性能,
例如:- filename=/opt/fiotest/fiotest.txt;
此处选择设备名称,则代表测试裸盘的性能,例:-filename=/dev/vdb1。
如果在已经分区、并创建文件系统,且已写入数据的磁盘上进行性能测试,
请注意filename选择指定文件,以避免覆盖文件系统和原有数据。*/

-direct=1 /*定义是否使用direct IO,可选值如下:值为0,表示使用buffered IO;
值为1,表示使用 direct IO,测试过程绕过机器自带的buffer。使测试结果更真实。*/

-ioengine=libaio   /*libaio指的是异步模式,如果是同步就要用sync。
    vsync - 使用 readv / writev,主要是会将相邻的 I/O 进行合并 
    psync - 对应的 pread / pwrite,增量同步,一般sync是全量的
    pvsync / pvsync2 - 对应的 preadv / pwritev,以及 preadv2 / p writev2
定义fio如何下发IO请求,通常有同步IO和异步IO:
同步IO一次只能发出一个IO请求, 等待内核完成后才返回。
这样对于单个线程IO队列深度总是小于1,但是可以透过多个线程并发执行来解决。
通常会用16~32个线程同时工作把IO队列深度塞满。
异步IO则通常使用libaio这样的方式一次提交一批                         
IO 请求,然后等待一批的完成,减少交互的次数,会更有效率*/

-iodepth=64 /*定义测试时的IO队列深度,默认为1。
此处定义的队列深度是指每个线程的队列深度, 
如果有多个线程测试,意味着每个线程都是此处定义的队列深度。
fio总的IO并发数 =iodepth * numjobs*/

-rw=randwrite  /*定义测试时的读写策略,
可选值如下:
随机读:randread,
随机写:randwrite,
顺序读: read,
顺序写:write,
混合随机读写:randrw-bs=4k /*定义IO的块大小(block size),
单位是k、K、m和M等,默认IO块大小为4 KB*/

-size=100M  /*定义测试IO操作的数据量,若未指定runtime这类参数,
fio会将指定大小的数据量全部 读/写完成,然后才停止测试。
该参数的值,可以是带单位的数字,比如size=10G,
表示读/写的数据量为10GB;也可是百分数,比如size=20%,
表示读/写的数据量占该设备总文件的20%的空间。
建议测试数据量为内存两倍大,尽量避免缓存影响。*/

-numjobs=4 /*每个job(任务)开1个线程,这里用了几,
后面每个用-name指定的任务就开几个线程测试。
所以最终线程数=任务数(几个name=jobx)*  numjobs。 */

-runtime /*定义测试时间。如果未配置,则持续将size指定的文件大小,
以每次bs值为分块大小读/ 写完。*/

-group_reporting /*定义测试结果显示模式,
group_reporting 表示汇总每个进程的统计信息,而非以不同 job汇总展示信息。*/


-thread    /*使用pthread_create创建线程,另一种是fork创建进程。
进程的开销比线程要大,一般都采用thread测试。*/

-name=job1 /*定义测试任务名称。*/

–output TestResult.log /*日志输出到TestResult.log。*/

-lockmem=1g /*只使用1g内存进行测试。 */

-zero_buffers /*用0初始化系统buffer。*/

-nrfiles=8  /*每个进程生成文件的数量。*/

-bs=4k   /*单次io的块文件大小为4k*/

-numjobs=10    /*本次测试的线程数是10*/

-size=5G     /*每个线程读写的数据量是5GB*/

常用命令

  • 顺序读
fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=read 
  -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 
    -group_reporting -name=test001
  • 顺序写
fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=write 
  -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 
    -group_reporting -name=test001
  • 随机读
fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randread
  -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 
    -group_reporting -name=test001
  • 随机写
fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randwrite 
  -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 
    -group_reporting -name=test001
  • 随机混合读写
fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 
  -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=100 
    -group_reporting -name=mytest -ioscheduler=noop
  • 磁盘读写常用测试点
1.  Read=100% Ramdon=100% rw=randread (100%随机读)
2.  Read=100% Sequence=100% rw=read (100%顺序读)
3.  Write=100% Sequence=100% rw=write (100%顺序写)
4.  Write=100% Ramdon=100% rw=randwrite (100%随机写)
5.  Read=70% Sequence=100% rw=rw, rwmixread=70, rwmixwrite=30(70%顺序读,30%顺序写)
6.  Read=70% Ramdon=100% rw=randrw, rwmixread=70, rwmixwrite=30(70%随机读,30%随机写) 

8C16G虚拟机测试

4k随机读写,70%读+30%写,30个并发, 文件系统测试
fio -direct=1 -iodepth=1 -thread -rw=randrw -rwmixread=70 -ioengine=libaio 
  -bs=4k -size=4G -numjobs=30 -runtime=60 -group_reporting 
    -filename=/data/test001.txt -name=test001


虚拟机磁盘IOPS读为677,写为277,无怪乎系统性能不高了,磁盘制约了系统响应!

24C64G物理机测试

4k随机读写,70%读+30%写,30个并发, 文件系统测试
fio -direct=1 -iodepth=1 -thread -rw=randrw -rwmixread=70 -ioengine=libaio 
  -bs=4k -size=4G -numjobs=30 -runtime=60 -group_reporting 
    -filename=/data/test001.txt -name=test001

物理机磁盘IOPS读为1097,写为473,性能高出虚拟机一大截!

物理机测试裸盘性能结果

输出报告分析

下面是每个执行的数据方向的I/O统计数据信息的代表值含义

  • read/write: 读/写的IO操作(还有一个trim没用过)
    • salt: 提交延迟,这是提交I/O所花费的时间(min:最小值,max:最大值,avg:平均值,stdev:标准偏差)
    • chat: 完成延迟,表示从提交到完成I/O部分的时间
    • lat: 相应时间,表示从fio创建I/O单元到完成I/O操作的时间
    • bw: 带宽统计
    • iops: IOPS统计
  • lat(nsec/usec/msec): I/O完成延迟的分布。这是从I/O离开fio到它完成的时间。与上面单独的读/写/修剪部分不同,这里和其余部分的数据适用于报告组的所有I/ o。10=0.01%意味着0.01%的I/O在250us以下完成。250=0.02%意味着0.02%的I/O需要10到250us才能完成。
  • cpu: cpu使用率
  • IO depths: I/O深度在作业生命周期中的分布
    • IO submit: 在一个提交调用中提交了多少个I/O。每一个分录表示该数额及其以下,直到上一分录为止——例如,4=100%意味着我们每次提交0到4个I/O调用
    • IO complete: 和上边的submit一样,不过这个是完成了多少个
    • IO issued rwt: 发出的read/write/trim请求的数量,以及其中有多少请求被缩短或删除
    • IO latency: 满足指定延迟目标所需的I/O深度

下面是Run status group 0 (all jobs) 全部任务汇总信息的代表值含义:

  • bw: 总带宽以及最小和最大带宽
  • io: 该组中所有线程执行的累计I/O
  • run: 这组线程中最小和最长的运行时。

最后是Linux中特有的磁盘状态统计信息的代表值含义:

  • ios: 所有组的I/ o个数
  • merge: I/O调度器执行的总合并数
  • ticks: 使磁盘繁忙的滴答数(仅供参考,原文是Number of ticks we kept the disk busy)
  • in_queue: 在磁盘队列中花费的总时间
  • util: 磁盘利用率。值为100%意味着我们保留了磁盘,如果一直很忙,那么50%的时间磁盘就会闲置一半的时间。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表