• 服务器io测试工具fio


    Fio 是一个 I/O 工具,旨在用于基准测试和压力/硬件验证。它支持 19 种不同类型的 I/O 引擎(sync、mmap、libaio、posixaio、SG v3、splice、null、network、syslet、guasi、solarisaio 等)、I/O 优先级(适用于较新的 Linux 内核) 、评估 I/O、分叉或线程作业等等。它可以在块设备和文件上工作。fio 接受简单易懂的文本格式的职位描述。包括几个示例作业文件。fio 显示各种 I/O 性能信息,包括完整的 IO 延迟和百分位数。Fio 在许多地方被广泛使用,用于基准测试、QA 和验证目的。它支持 Linux、FreeBSD、NetBSD、OpenBSD、OS X、OpenSolaris、AIX、HP-UX、Android 和 Windows。
    目前主流的第三方IO测试工具有fio、iometer 和 Orion,这三种工具各有千秋,在linux 下也可以使用dd 进行简单的磁盘(文件系统)测试(文末补充)。
    Fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的IO测试软件,可在没有安装oracle数据库的情况下模拟oracle数据库场景的读写。
    Multithreaded IO generation tool , FIO 是一个多线程io生成工具,可以生成多种IO模式,用来测试磁盘设备的性能(也包含文件系统:如针对网络文件系统 NFS 的IO测试)。

    1.安装fio工具

    1.1 yum 安装fio

    [root@s2ahumysqlpg01 fio-3.29]# yum install fio
    [root@s2ahumysqlpg01 fio-3.29]# yum info fio
    Loaded plugins: ulninfo
    Available Packages
    Name        : fio
    Arch        : x86_64
    Version     : 3.7
    Release     : 2.el7
    Size        : 467 k
    Repo        : centos-7-base
    Summary     : Multithreaded IO generation tool
    URL         : http://git.kernel.dk/?p=fio.git;a=summary
    License     : GPLv2
    Description : fio is an I/O tool that will spawn a number of threads or processes doing
                : a particular type of io action as specified by the user.  fio takes a
                : number of global parameters, each inherited by the thread unless
                : otherwise parameters given to them overriding that setting is given.
                : The typical use of fio is to write a job file matching the io load
                : one wants to simulate.

    1.2 源码安装fio

    #可根据实际测试中缺少的插件,安装依赖包
    yum -y install  libaio-devel  libaio-dev libaio* zilb*
    
    下载 https://git.kernel.dk/cgit/fio/
    
    tar  -zxvf fio-3.29.tar.gz
    cd fio-3.29
    # 注意如果编译的时候出现gcc 版本过低,可参考问题升级gcc 后在编译。 或者安装fio-3.20的版本
    ./configure 
    make
    make install
    
    [root@s2ahumysqlpg01 fio-3.29]# fio -v
    fio-3.29

    2.输入输出参数

    2.1Fio常用输入参数

    filename=/dev/emcpowerb 支持文件系统或者裸设备,-filename=/dev/sda
    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方式(同步I),如果要使用libaio引擎, 需要yum install libaio-devel包
    rwmixwrite=30              在混合读写的模式下,写占30%
    group_reporting           关于显示结果的,汇总每个进程的信息
    lockmem=1g                只使用1g内存进行测试
    zero_buffers                用0初始化系统buffer。
    nrfiles=8                     每个进程生成文件的数量。
    
    磁盘读写常用测试点:
        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%随机写)
    

    2.2Fio输出结果说明

    Fio工具读写测速结果参数说明
    io               执行了多少M的IO
    bw               平均IO带宽
    iops             IOPS
    runt             线程运行时间
    slat             提交延迟  (stdev指标准差)
    clat             完成延迟
    lat              响应时间
    bw               带宽
    cpu              利用率
    IO depths        io队列
    IO submit        单个IO提交要提交的IO数
    IO complete      与上面的提交编号类似,但用于完成。
    IO issued        发出的读/写请求的数量,以及其中有多少是短的。
    IO latencies     IO完延迟的分布
    io               总共执行了多少size的IO
    aggrb            group总带宽
    minb             最小平均带宽.
    maxb             最大平均带宽.
    mint             group中线程的最短运行时间.
    maxt             group中线程的最长运行时间.
    ios              所有group总共执行的IO数.
    merge            总共发生的IO合并数.
    ticks            我们保持磁盘繁忙的ticks数。
    io_queue         花费在队列上的总共时间.
    util             磁盘利用率
    

    3.测试场景

    3.1顺序读

    # 顺序读注意,bs 单次io的块文件大小,我们建议可以设置为数据库的块或页大小,在真实的环境中或以调大size        
    fio -filename=/dev/sda1 -direct=1 -iodepth= 1 -rw=read -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100read_4k
    
    [root@s2ahumysqlpg01 tmp]# fio -filename=/tmp/read.dat -direct=1 -iodepth 1  -rw=read -ioengine=psync -bs=4k -size=4G -numjobs=1 -runtime=180 -group_reporting -name=sqe_100read_4k
    sqe_100read_4k: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
    fio-3.29
    Starting 1 process
    sqe_100read_4k: Laying out IO file (1 file / 4096MiB)
    Jobs: 1 (f=1): [R(1)][100.0%][r=8372KiB/s][r=2093 IOPS][eta 00m:00s]ta 00m:56s]
    sqe_100read_4k: (groupid=0, jobs=1): err= 0: pid=5685: Fri Mar  4 17:42:10 2022
      read: IOPS=3317, BW=13.0MiB/s (13.6MB/s)(2332MiB/180001msec)
        clat (usec): min=209, max=535634, avg=296.20, stdev=1443.62
         lat (usec): min=210, max=535635, avg=297.13, stdev=1443.62
        clat percentiles (usec):
         |  1.00th=[  233],  5.00th=[  241], 10.00th=[  243], 20.00th=[  247],
         | 30.00th=[  251], 40.00th=[  253], 50.00th=[  258], 60.00th=[  265],
         | 70.00th=[  269], 80.00th=[  281], 90.00th=[  302], 95.00th=[  330],
         | 99.00th=[  627], 99.50th=[ 1074], 99.90th=[ 4817], 99.95th=[ 9896],
         | 99.99th=[34866]
       bw (  KiB/s): min=   32, max=15432, per=100.00%, avg=13284.66, stdev=2559.17, samples=359
       iops        : min=    8, max= 3858, avg=3321.16, stdev=639.79, samples=359
      lat (usec)   : 250=28.88%, 500=69.77%, 750=0.58%, 1000=0.21%
      lat (msec)   : 2=0.36%, 4=0.08%, 10=0.06%, 20=0.03%, 50=0.02%
      lat (msec)   : 100=0.01%, 250=0.01%, 500=0.01%, 750=0.01%
      cpu          : usr=3.56%, sys=7.57%, ctx=597121, majf=0, minf=14
      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=597112,0,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):
       READ: bw=13.0MiB/s (13.6MB/s), 13.0MiB/s-13.0MiB/s (13.6MB/s-13.6MB/s), io=2332MiB (2446MB), run=180001-180001msec
    
    Disk stats (read/write):
      sda: ios=599673/169, merge=2/7, ticks=185089/422, in_queue=184716, util=90.06%

    我们需要得点关注的是IOPS :3317 以及BW IO带宽是:13.0MiB/s
    read: IOPS=3317, BW=13.0MiB/s (13.6MB/s)(2332MiB/180001msec)

    3.2 随机写

    #随机写 -rw=randwrite ,我们启用了50个进程模拟
    [root@s2ahumysqlpg01 fio-3.29]# fio -filename=/tmp/write.dat -direct=1 -iodepth 1  -rw=randwrite -ioengine=psync -bs=4k -size=4G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100write_4k
    sqe_100write_4k: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
    ...
    fio-3.29
    Starting 50 processes
    sqe_100write_4k: Laying out IO file (1 file / 4096MiB)
    Jobs: 50 (f=50): [w(50)][100.0%][w=3692KiB/s][w=923 IOPS][eta 00m:00s] 
    sqe_100write_4k: (groupid=0, jobs=50): err= 0: pid=7128: Fri Mar  4 17:54:18 2022
      write: IOPS=1108, BW=4434KiB/s (4540kB/s)(781MiB/180331msec); 0 zone resets
        clat (usec): min=311, max=5969.7k, avg=45097.62, stdev=236640.38
         lat (usec): min=313, max=5969.7k, avg=45098.90, stdev=236640.39
        clat percentiles (usec):
         |  1.00th=[    750],  5.00th=[   1057], 10.00th=[   1303],
         | 20.00th=[   1647], 30.00th=[   1844], 40.00th=[   2343],
         | 50.00th=[   3064], 60.00th=[   3687], 70.00th=[   4047],
         | 80.00th=[   4948], 90.00th=[  22938], 95.00th=[ 164627],
         | 99.00th=[1283458], 99.50th=[1753220], 99.90th=[2634023],
         | 99.95th=[3640656], 99.99th=[5939135]
       bw (  KiB/s): min=  350, max=103337, per=100.00%, avg=7568.53, stdev=265.17, samples=10555
       iops        : min=   50, max=25811, avg=1887.29, stdev=66.26, samples=10555
      lat (usec)   : 500=0.09%, 750=0.95%, 1000=3.17%
      lat (msec)   : 2=29.75%, 4=34.89%, 10=18.41%, 20=2.36%, 50=2.42%
      lat (msec)   : 100=1.74%, 250=2.29%, 500=1.44%, 750=0.83%, 1000=0.34%
      lat (msec)   : 2000=1.02%, >=2000=0.30%
      cpu          : usr=0.03%, sys=0.15%, ctx=220103, majf=0, minf=821
      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,199884,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=4434KiB/s (4540kB/s), 4434KiB/s-4434KiB/s (4540kB/s-4540kB/s), io=781MiB (819MB), run=180331-180331msec
    
    Disk stats (read/write):
      sda: ios=0/218756, merge=0/1942, ticks=0/9721312, in_queue=9809977, util=100.00%

    我们可以看到IOPS是1108 ,BW带宽只有 4434KiB/s
    write: IOPS=1108, BW=4434KiB/s (4540kB/s)(781MiB/180331msec); 0 zone resets

    3.3随机读写混合

    #70%随机读-rwmixread=70 ,30%随机写
    [root@s2ahumysqlpg01 fio-3.29]# fio -filename=/tmp/read_write.dat -direct=1 -iodepth=1 -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=4G -numjobs=50 -runtime=180 -group_reporting -name=randrw_70read_4k
    
    randrw_70read_4k: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
    ...
    fio-3.29
    Starting 50 processes
    randrw_70read_4k: Laying out IO file (1 file / 4096MiB)
    Jobs: 6 (f=6): [m(1),_(7),m(1),_(7),m(1),_(4),m(1),_(6),m(1),_(14),m(1),_(6)][2.2%][r=10.9MiB/s,w=4884KiB/s][r=2801,w=1221 IOPS][eta 02h:11m:59s]
    randrw_70read_4k: (groupid=0, jobs=50): err= 0: pid=8027: Fri Mar  4 18:01:37 2022
      read: IOPS=1802, BW=7209KiB/s (7382kB/s)(1268MiB/180113msec)
        clat (usec): min=225, max=3503.6k, avg=18238.79, stdev=55447.72
         lat (usec): min=226, max=3503.6k, avg=18239.86, stdev=55447.72
        clat percentiles (usec):
         |  1.00th=[    330],  5.00th=[    553], 10.00th=[    635],
         | 20.00th=[    799], 30.00th=[   1074], 40.00th=[   1631],
         | 50.00th=[   3326], 60.00th=[   8717], 70.00th=[  17433],
         | 80.00th=[  28967], 90.00th=[  47973], 95.00th=[  69731],
         | 99.00th=[ 147850], 99.50th=[ 196084], 99.90th=[ 429917],
         | 99.95th=[ 859833], 99.99th=[2936013]
       bw (  KiB/s): min=  350, max=25119, per=100.00%, avg=8438.00, stdev=106.40, samples=15326
       iops        : min=   50, max= 6272, avg=2094.52, stdev=26.64, samples=15326
      write: IOPS=774, BW=3096KiB/s (3171kB/s)(545MiB/180113msec); 0 zone resets
        clat (usec): min=251, max=3576.5k, avg=22074.38, stdev=134044.57
         lat (usec): min=252, max=3576.5k, avg=22075.53, stdev=134044.60
        clat percentiles (usec):
         |  1.00th=[    347],  5.00th=[    537], 10.00th=[    603],
         | 20.00th=[    709], 30.00th=[    816], 40.00th=[    955],
         | 50.00th=[   1188], 60.00th=[   1565], 70.00th=[   2311],
         | 80.00th=[   4080], 90.00th=[   9634], 95.00th=[  35390],
         | 99.00th=[ 583009], 99.50th=[1082131], 99.90th=[1501561],
         | 99.95th=[1837106], 99.99th=[3472884]
       bw (  KiB/s): min=  350, max=13399, per=100.00%, avg=3753.05, stdev=51.84, samples=14762
       iops        : min=   50, max= 3343, avg=923.38, stdev=13.00, samples=14762
      lat (usec)   : 250=0.06%, 500=2.99%, 750=16.22%, 1000=12.87%
      lat (msec)   : 2=18.13%, 4=10.02%, 10=10.01%, 20=8.68%, 50=13.12%
      lat (msec)   : 100=5.06%, 250=1.98%, 500=0.44%, 750=0.11%, 1000=0.09%
      lat (msec)   : 2000=0.18%, >=2000=0.02%
      cpu          : usr=0.06%, sys=0.14%, ctx=488255, majf=0, minf=1027
      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=324593,139424,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):
       READ: bw=7209KiB/s (7382kB/s), 7209KiB/s-7209KiB/s (7382kB/s-7382kB/s), io=1268MiB (1330MB), run=180113-180113msec
      WRITE: bw=3096KiB/s (3171kB/s), 3096KiB/s-3096KiB/s (3171kB/s-3171kB/s), io=545MiB (571MB), run=180113-180113msec
    
    Disk stats (read/write):
      sda: ios=324721/139458, merge=0/2, ticks=5905787/3076202, in_queue=8984158, util=100.00%
    

    从结果中我们可以看到70%随机读的IOPS 是1802 ,30%随机写是774 ,而带宽分别是7209KiB/s,3096KiB/s。
    read: IOPS=1802, BW=7209KiB/s (7382kB/s)(1268MiB/180113msec)
    write: IOPS=774, BW=3096KiB/s (3171kB/s)(545MiB/180113msec); 0 zone resets

    4.补充测试

    4.1 测试建议

    fio 用于测试磁盘性能时,测试之前需要先把要测试的磁盘卸载掉,测试完后需格式化一遍再挂载上去。

    # 卸载磁盘
    umount /mnt/datadir1
    
    # 格式化磁盘
    mkfs.ext4 /dev/sdd
    
    # 挂载磁盘
    mount -t ext4 /dev/sdd /mnt/datadir1
    
    # 自动挂载,在里面添加该盘
    vim /etc/fstab

    4.2IO监控

    进行磁盘测试的时候,我们可以使用iostat 等监控工具,查看所有磁盘当前的读写状态(fedora 系统上 sysstat-11.7.3-2.fc29.x86_64 收录了此工具)。
    监控磁盘IO命令:iostat –mx 1
    
    # iostat –mx 1
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               0.25    0.00    3.01   80.70    0.00   16.04
    
    Device            r/s     w/s     rMB/s     wMB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
    sda           13417.00    0.00    209.64      0.00     0.00     0.00   0.00   0.00    2.23    0.00  29.96    16.00     0.00   0.07 100.00
    
    
        rrqms:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge)
        wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
        rsec/s:The number of sectors read from the device per second.
        wsec/s:The number of sectors written to the device per second.
        rKB/s:The number of kilobytes read from the device per second.
        wKB/s:The number of kilobytes written to the device per second.
        avgrq-sz:平均请求扇区的大小,The average size (in sectors) of the requests that were issued to the device.
        avgqu-sz:是平均请求队列的长度。毫无疑问,队列长度越短越好,The average queue length of the requests that were issued to the device.   
        await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
        这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
        svctm:表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好。
        如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。
        %util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,
        所以该参数暗示了设备的繁忙程度,一般地,如果该参数是100%表示磁盘设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

    4.3IOFIO 图形界面工具

    FIO 图形界面工具:fio性能测试工具新添图形前端gfio ,apt install gfio # fio 图形测试工具。

    5.dd测试

    dd 也是我们经常使用到的磁盘测试工具,Linux服务器装好系统之后,想要知道硬盘的读写是否能满足服务的需要,如果不满足硬盘的IO就是服务的一个瓶颈。我们可以使用dd命令简单进行测试,更为专业的测试可以使用上面描述的fio 工具:
    time有计时作用,dd用于复制,从if读出,写到of。if=/dev/zero不产生IO,因此可以用来测试纯写速度。同理of=/dev/null不产生IO,可以用来测试纯读速度。bs是每次读或写的大小,即一个块的大小,count是读写块的数量。

    5.1 dd纯写速度

    [root@s2ahumysqlpg01 fio-3.29]# time dd if=/dev/zero of=/tmp/ddout bs=8k count=5000
    5000+0 records in
    5000+0 records out
    40960000 bytes (41 MB) copied, 0.055353 s, 740 MB/s
    
    real    0m0.288s
    user    0m0.004s
    sys     0m0.276s
    [root@s2ahumysqlpg01 fio-3.29]# time dd if=/dev/zero of=/tmp/ddout bs=8k count=50000
    50000+0 records in
    50000+0 records out
    409600000 bytes (410 MB) copied, 1.59508 s, 257 MB/s
    
    real    0m1.604s
    user    0m0.021s
    sys     0m0.379s
    [root@s2ahumysqlpg01 fio-3.29]# time dd if=/dev/zero of=/tmp/ddout bs=8k count=500000
    500000+0 records in
    500000+0 records out
    4096000000 bytes (4.1 GB) copied, 40.5061 s, 101 MB/s
    
    real    0m40.584s
    user    0m0.279s
    sys     0m4.036s

    dd 测试读写速度,就是读当前磁盘文件,再写入当前磁盘之中。一定程度上,复制量越大,读写的时间越长,统计的结果越准。但是测试结果信息量较少,只能作为参考量,更多读写模式和测试信息:可以使用dd 命令参数来配置:
    使用conv, iflag, oflag 三个变量可以配置dd 命令的复制模块式,读取模式和写入模式;

    #CONV 选项有:
       ascii 从 EBCDIC 到 ASCII
       ebcdic 从 ASCII 到 EBCDIC
       ibm   从 ASCII 到备用 EBCDIC
       block   用空格填充换行符终止的记录到 cbs-size
       unblock 用换行符替换 cbs-size 记录中的尾随空格
       lcase 将大写改为小写
       ucase 将小写变为大写
       sparse 尝试寻找而不是写入 NUL 输入块的输出
       swab 交换每对输入字节
       sync   用 NUL 填充每个输入块到 ibs 大小; 与 block 或 unblock 一起使用时,用空格而不是 NUL 填充
       excl   如果输出文件已经存在,则失败
       nocreat 不创建输出文件
       notrunc 不截断输出文件
       noerror 在读取错误后继续
       fdatasync 在完成之前物理写入输出文件数据
       fsync 同样,还要写入元数据
    
    #FLAG( iflag, oflag) 选项有:
       append    附加模式(仅对输出有意义;建议使用 conv=notrunc)
       direct    对数据使用直接 I/O
       directory 除非目录失败
       dsync     对数据使用同步 I/O
       sync      同样,也适用于元数据      
       fullblock 累积输入的完整块(仅 iflag)
       nonblock  使用非阻塞 I/O
       noatime   不更新访问时间
       nocache   丢弃缓存数据
       noctty    不从文件中分配控制终端
       nofollow   不遵循符号链接
       count_bytes 将 'count=N' 视为字节数(仅限 iflag)
       skip_bytes  将 'skip=N' 视为字节数(仅 iflag)
       seek_bytes  将 'seek=N' 视为字节数(仅用于标记)
    
    #如果要规避掉文件系统cache,直接读写,不使用buffer cache,需做这样的设置
    iflag=direct,nonblock
    oflag=direct,nonblock

    5.2 dd纯读速度

    [root@s2ahumysqlpg01 fio-3.29]# time dd if=/tmp/ddout of=/dev/null bs=4k count=5000
    5000+0 records in
    5000+0 records out
    20480000 bytes (20 MB) copied, 0.180166 s, 114 MB/s
    
    real    0m0.198s
    user    0m0.000s
    sys     0m0.033s
    [root@s2ahumysqlpg01 fio-3.29]# time dd if=/tmp/ddout of=/dev/null bs=4k count=50000
    50000+0 records in
    50000+0 records out
    204800000 bytes (205 MB) copied, 1.5581 s, 131 MB/s
    
    real    0m1.560s
    user    0m0.026s
    sys     0m0.271s
    [root@s2ahumysqlpg01 fio-3.29]# time dd if=/tmp/ddout of=/dev/null bs=4k count=500000
    500000+0 records in
    500000+0 records out
    2048000000 bytes (2.0 GB) copied, 18.0358 s, 114 MB/s
    
    real    0m18.038s
    user    0m0.240s
    sys     0m2.054s

    5.3 dd 命令三种经典测试

    # dd 命令三种经典使用方法:
    dd if=/dev/zero of=test bs=64k count=16k  是不准确的,可能有数据存在内核缓存中,没有同步到磁盘上。对于关键数据应该加上fsync标识,防止关键数据丢失;
    dd if=/dev/zero of=test bs=64k count=16k conv=fsync 较为稳妥,但是时间用时较长,他在dd结束前会写数据和文件元数据到磁盘;
    dd if=/dev/zero of=test bs=64k count=4k oflag=dsync or sync  每写一次就写一次磁盘,在实际操作中,可以听到磁盘响声,用时较长;
    更多dd 命令详细使用方法,可以参考man pages. dd 命令可以用来制作启动盘,请参见博文 <a href="https://www.cnblogs.com/xuyaowen/p/linux_make_USB_boot.html" target="_blank" style="text-decoration:none;color:rgb(0, 0, 0);">linux (fedora 28) 制作启动U盘,启动盘</a>
    
    #SSD 性能测试:
    PCIe-SSD Optane: dd if=/dev/urandom of=./optane.bin bs=256k count=102400  (顺序写 25GB的随机数据) 
    M.2-STAT-SSD: dd if=/dev/urandom of=./m2sata.bin bs=256k count=102400  (顺序写 25GB的随机数据) 
    M.2-NVMe-SSD: dd if=/dev/urandom of=./m2nvme.bin bs=256k count=102400  (顺序写 25GB的随机数据) 
    HDD: dd if=/dev/urandom of=./sata.bin bs=256k count=102400  (顺序写 25GB的随机数据) 
    
    

    6.关于gcc 版本过低问题

    [root@s2ahumysqlpg01 fio-3.29]# ./configure 
    Operating system              Linux
    CPU                           x86_64
    Big endian                    no
    Compiler                      gcc
    Cross compile                 no
    
    Static build                  no
    
    Your compiler doesn't support C11 atomics. gcc 4.9/clang 3.6 are the
    minimum versions with it - perhaps your compiler is too old?
    C11 atomics support not found
    Configure failed, check config.log and/or the above output   
    
    # 升级gcc 版本到 5.2 
    ## 1.安装centos-release-scl 工具
    wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/centos-release-scl-2-3.el7.centos.noarch.rpm
     wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/centos-release-scl-rh-2-3.el7.centos.noarch.rpm
    
    
    [root@s2ahumysqlpg01 yum.repos.d]# rpm -ivh  *.rpm
    warning: centos-release-scl-2-3.el7.centos.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
    Preparing...                          ################################# [100%]
    Updating / installing...
       1:centos-release-scl-rh-2-3.el7.cen################################# [ 50%]
       2:centos-release-scl-2-3.el7.centos################################# [100%] 
    
    #2.安装devtoolset,注意,如果想安装7.*版本的,就改成devtoolset-7-gcc*,以此类推
    yum install centos-release-scl 
    
    #3. 激活对应的devtoolset,所以你可以一次安装多个版本的devtoolset,需要的时候用下面这条命令切换到对应的版本
    enable devtoolset-8 bash
    
    #4.查看一下gcc版本
    gcc -v
    #5. 这条激活命令只对本次会话有效,重启会话后还是会变回原来的4.8.5版本,如下操作可以直接替换旧的gcc
    旧的gcc是运行的 /usr/bin/gcc,所以将该目录下的gcc/g++替换为刚安装的新版本gcc软连接,免得每次enable , 一般个人不建议直接替换
    mv /usr/bin/gcc /usr/bin/gcc-4.8.5
    ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc
    mv /usr/bin/g++ /usr/bin/g++-4.8.5
    ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++
    gcc --version
    g++ --version
    

    参考

    https://github.com/axboe/fio/
    https://git.kernel.dk/cgit/fio/
    http://freshmeat.sourceforge.net/projects/fio/
    https://www.cnblogs.com/jixiaohua/p/11732225.html
    https://blog.csdn.net/qq_41800205/article/details/115233245
    https://www.cnblogs.com/xuyaowen/p/dd.html





  • 相关阅读:
    iOS开发之字符串去掉首尾空格换行
    iOS开发之截取UIScrollView长图方法、截长图
    iOS开发之语音录制
    iOS开发之程序各种状态监听
    iOS开发之监听应用进入前台后台
    iOS开发之波浪动画效果
    mysql 主从一致性检查
    git 备份和恢复
    tomcat server.xml配置文件 解析
    检查MySQL主从数据一致性
  • 原文地址:https://www.cnblogs.com/cqdba/p/15965713.html
Copyright © 2020-2023  润新知