Techyou labs
文章RSS
评论RSS
登录
真正的爱应该超越生命的长度,心灵的宽度,灵魂的深度
搜索
关于作者
文章分类
Default
Linux/Unix
Database
Cloud
Networking
Security
Programming
最新文章
带你重走 TiDB TPS 提升 1000 倍的性能优化之旅
Unicode 中的 BIDI 双向性算法[转]
在linux中设置优先使用ipv4,而不是ipv6
linux下WPS高分辨率下因字体缩放导致字体发虚的问题
ssh-rsa not in pubkeyacceptedalgorithms问题解答及处理办法 Permission denied (publickey)
在 Ubuntu 22.04 中使用 PipeWire 替换 PulseAudio
MYSQL简单监控指标
deepin-wine6-stable下TIM悄悄崩溃问题
openwrt 设置ipv6地址分配
Redis 实战篇:巧用数据类型实现亿级数据统计
最新评论
renothing: 备注:路由器端优先设置ipv4并不影响客户端的ip...
renothing: 二次反向代理跟你应用程序得处理时间有关系吧?尤其是...
二次反向代理性能很差,怎么优化的?: 我也用nginx 做了个二次反向代理,但是并发连3...
hostyep: 交换链接么?目前每天保持30个左右对口IP,每月都...
yzhkpli: error while loading share...
美肤宝: 感谢分享。。。
lq: 嗯 喜欢弄得点单点
按月归档
March 2023
December 2022
November 2022
September 2022
August 2022
March 2022
January 2022
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
February 2021
September 2020
May 2020
September 2019
August 2019
July 2019
June 2019
May 2019
January 2019
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
April 2018
March 2018
December 2017
October 2017
September 2017
August 2017
April 2017
March 2017
February 2017
August 2016
July 2015
November 2014
September 2014
August 2014
July 2014
June 2014
July 2013
April 2013
September 2012
July 2012
May 2012
April 2012
February 2012
January 2012
December 2011
November 2011
October 2011
September 2011
August 2011
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
December 2009
November 2009
October 2009
September 2009
August 2009
June 2009
May 2009
April 2009
March 2009
February 2009
December 2008
November 2008
September 2008
August 2008
July 2008
June 2008
常用标签
Mysql
nginx
mysql优化
linux
debian
Powered by
Typecho)))
Optimized by
EAimTY
IO测试工具之fio
November 4, 2010
目前主流的第三方IO测试工具有fio、iometer和Orion,这三种工具各有千秋。 fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的IO测试软件,可在没有安装oracle数据库的情况下模拟oracle数据库场景的读写。 如下是在Linux系统上采用fio工具来对SAN存储进行的IO测试。 # 1、安装fio 在fio官网下载fio-2.1.10.tar文件,解压后./configure、make、make install之后就可以使用fio了。 # 2、fio参数解释 可以使用fio -help查看每个参数,具体的参数左右可以在官网查看how to文档,如下为几个常见的参数描述 ``` filename=/dev/sda2 支持文件系统或者裸设备,-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 每个进程生成文件的数量 ``` # 3、fio测试场景及生成报告详解 测试场景: ``` 100%随机,100%读, 4K fio -filename=/data/xxx -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=rand_100read_4k 100%随机,100%写, 4K fio -filename=/data/xxx -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=rand_100write_4k 100%顺序,100%读 ,4K fio -filename=/data/xxx -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100read_4k 100%顺序,100%写 ,4K fio -filename=/data/xxx -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100write_4k 100%随机,70%读,30%写 4K fio -filename=/data/xxx -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=randrw_70read_4k ``` 结果报告查看: ``` root@dedi-par-84767:~# fio -filename=/data/xxx -direct=1 -iodepth 2 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=64k -size=1G -numjobs=50 -runtime=180 -group_reporting -name=randrw_70read_64k_report randrw_70read_64k_report: (g=0): rw=randrw, bs=64K-64K/64K-64K/64K-64K, ioengine=psync, iodepth=2 ... fio-2.2.10 Starting 50 threads Jobs: 32 (f=32): [_(1),m(2),_(1),m(4),_(1),m(6),E(2),m(4),_(1),m(1),_(2),m(5),_(1),m(1),_(1),m(1),_(1),m(2),_(3),E(1),m(5),_(1),m(1),E(2)] [7.2% done] [3776KB/1536KB/0KB /s] [59/24/0 iops] [eta 38m:59s] randrw_70read_4k_local: (groupid=0, jobs=50): err= 0: pid=1945: Sat Nov 3 18:03:28 2018 read : io=688704KB, bw=3814.2KB/s, iops=59, runt=180565msec clat (msec): min=3, max=2338, avg=608.16, stdev=207.73 lat (msec): min=3, max=2338, avg=608.16, stdev=207.73 clat percentiles (msec): | 1.00th=[ 119], 5.00th=[ 285], 10.00th=[ 367], 20.00th=[ 457], | 30.00th=[ 515], 40.00th=[ 562], 50.00th=[ 603], 60.00th=[ 644], | 70.00th=[ 693], 80.00th=[ 750], 90.00th=[ 840], 95.00th=[ 947], | 99.00th=[ 1188], 99.50th=[ 1418], 99.90th=[ 1827], 99.95th=[ 1909], | 99.99th=[ 2057] bw (KB /s): min= 27, max= 608, per=2.65%, avg=101.13, stdev=38.07 write: io=274560KB, bw=1520.6KB/s, iops=23, runt=180565msec clat (usec): min=487, max=1789.2K, avg=574751.36, stdev=276560.39 lat (usec): min=488, max=1789.2K, avg=574753.64, stdev=276560.34 clat percentiles (usec): | 1.00th=[ 556], 5.00th=[ 684], 10.00th=[16512], 20.00th=[423936], | 30.00th=[497664], 40.00th=[552960], 50.00th=[602112], 60.00th=[651264], | 70.00th=[700416], 80.00th=[749568], 90.00th=[847872], 95.00th=[995328], | 99.00th=[1302528], 99.50th=[1449984], 99.90th=[1761280], 99.95th=[1777664], | 99.99th=[1794048] bw (KB /s): min= 35, max= 503, per=5.95%, avg=90.46, stdev=32.97 lat (usec) : 500=0.01%, 750=1.54%, 1000=0.40% lat (msec) : 2=0.52%, 4=0.18%, 10=0.25%, 20=0.11%, 50=0.23% lat (msec) : 100=0.54%, 250=2.33%, 500=22.03%, 750=52.22%, 1000=15.70% lat (msec) : 2000=3.91%, >=2000=0.02% cpu : usr=0.00%, sys=0.01%, ctx=30201, 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 : total=r=10761/w=4290/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0 latency : target=0, window=0, percentile=100.00%, depth=2 Run status group 0 (all jobs): READ: io=688704KB, aggrb=3814KB/s, minb=3814KB/s, maxb=3814KB/s, mint=180565msec, maxt=180565msec WRITE: io=274560KB, aggrb=1520KB/s, minb=1520KB/s, maxb=1520KB/s, mint=180565msec, maxt=180565msec Disk stats (read/write): md1: ios=10751/4394, merge=0/0, ticks=0/0, in_queue=0, util=0.00%, aggrios=16338/15400, aggrmerge=78497/78550, aggrticks=537654/108236, aggrin_queue=646570, aggrutil=97.80% sdb: ios=231/26335, merge=0/157064, ticks=28700/131672, in_queue=160336, util=44.92% sda: ios=32445/4465, merge=156995/36, ticks=1046608/84800, in_queue=1132804, util=97.80% ``` 关键指标说明: ``` io=执行了多少M的IO bw=平均IO带宽 iops=IOPS runt=线程运行时间 slat=提交延迟 clat=完成延迟 lat=响应时间 bw=带宽 cpu=利用率 IO depths=io队列 IO submit=单个IO提交要提交的IO数 IO complete=Like the above submit number, but for completions instead. IO issued=The number of read/write requests issued, and how many of them were short. IO latencies=IO完延迟的分布 io=总共执行了多少size的IO aggrb=group总带宽 minb=最小.平均带宽. maxb=最大平均带宽. mint=group中线程的最短运行时间. maxt=group中线程的最长运行时间. ios=所有group总共执行的IO数. merge=总共发生的IO合并数. ticks=Number of ticks we kept the disk busy. io_queue=花费在队列上的总共时间. util=磁盘利用率 ``` # 4、扩展之IO队列深度 在某个时刻,有N个inflight的IO请求,包括在队列中的IO请求、磁盘正在处理的IO请求。N就是队列深度。 加大硬盘队列深度就是让硬盘不断工作,减少硬盘的空闲时间。 加大队列深度 -> 提高利用率 -> 获得IOPS和MBPS峰值 ->注意响应时间在可接受的范围内, 增加队列深度的办法有很多,使用异步IO,同时发起多个IO请求,相当于队列中有多个IO请求,多线程发起同步IO请求,相当于队列中有多个IO请求。 增大应用IO大小,到达底层之后,会变成多个IO请求,相当于队列中有多个IO请求 队列深度增加了。 队列深度增加了,IO在队列的等待时间也会增加,导致IO响应时间变大,这需要权衡。 为何要对磁盘I/O进行并行处理呢?主要目的是提升应用程序的性能。这一点对于多物理磁盘组成的虚拟磁盘(或LUN)显得尤为重要。 如果一次提交一个I/O,虽然响应时间较短,但系统的吞吐量很小。 相比较而言,一次提交多个I/O既缩短了磁头移动距离(通过电梯算法),同时也能够提升IOPS。 假如一部电梯一次只能搭乘一人,那么每个人一但乘上电梯,就能快速达到目的地(响应时间),但需要耗费较长的等待时间(队列长度)。 因此一次向磁盘系统提交多个I/O能够平衡吞吐量和整体响应时间。 Linux系统查看默认队列深度: ``` root@dedi-par-84767:~# lsscsi -l [0:0:0:0] disk ATA ST1000NM0033-9ZM GA0A /dev/sda state=running queue_depth=31 scsi_level=6 type=0 device_blocked=0 timeout=30 [1:0:0:0] disk ATA ST1000NM0033-9ZM GA0A /dev/sdb state=running queue_depth=31 scsi_level=6 type=0 device_blocked=0 timeout=30 root@dedi-par-84767:~# ``` 使用dd命令设置bs=2M进行测试: ``` root@dedi-par-84767:~# dd if=/dev/zero of=/data/xx bs=2M count=1000 oflag=direct 1000+0 records in 1000+0 records out 2097152000 bytes (2.1 GB, 2.0 GiB) copied, 16.1112 s, 130 MB/s ``` 使用iostat监测 ``` Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 1728.33 0.00 260.00 32.00 126741.33 16384.17 980.31 1.49 5.09 3.96 14.25 2.64 77.07 sdb 0.00 1720.67 0.00 292.67 0.00 143680.17 981.87 2.82 9.64 0.00 9.64 3.38 98.80 md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 md1 0.00 0.00 0.33 31.67 1.33 16384.00 1024.08 0.00 0.00 0.00 0.00 0.00 0.00 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 134.00 0.00 34.33 229.67 10753.33 117642.67 972.70 3.61 13.38 27.57 11.26 3.21 84.67 sdb 0.00 134.00 0.00 263.67 0.00 128394.67 973.92 2.86 10.82 0.00 10.82 2.98 78.53 md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 md1 0.00 0.00 0.00 230.67 0.00 118101.33 1024.00 0.00 0.00 0.00 0.00 0.00 0.00 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 126.33 9.33 34.33 252.67 10880.00 128840.00 973.66 3.39 12.09 25.01 10.33 3.20 91.73 sdb 0.00 145.33 0.00 286.67 0.00 139901.33 976.06 3.34 11.64 0.00 11.64 3.20 91.73 md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 md1 0.00 0.00 0.00 262.00 0.00 129064.00 985.22 0.00 0.00 0.00 0.00 0.00 0.00 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 67.67 0.00 25.00 260.00 5930.67 133120.00 975.79 3.32 11.69 32.80 9.66 3.10 88.40 sdb 0.00 67.67 0.00 283.33 0.00 138144.00 975.13 3.01 10.45 0.00 10.45 3.01 85.20 md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 md1 0.00 0.00 0.00 258.67 0.00 132437.33 1024.00 0.00 0.00 0.00 0.00 0.00 0.00 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 53.67 3.33 21.67 246.33 4821.33 125626.67 973.49 3.22 12.04 34.34 10.08 3.21 86.13 sdb 0.00 57.00 0.00 269.33 0.00 131130.67 973.74 3.28 12.34 0.00 12.34 3.27 88.13 md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 md1 0.00 0.00 0.00 250.67 0.00 126309.33 1007.79 0.00 0.00 0.00 0.00 0.00 0.00 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 76.33 3.00 24.67 247.67 6058.67 126308.00 972.09 3.20 11.63 27.89 10.01 3.09 84.27 sdb 0.00 73.00 0.00 273.67 0.00 132878.67 971.10 3.20 11.74 0.00 11.74 3.15 86.27 md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 md1 0.00 0.00 0.00 250.33 0.00 126308.00 1009.12 0.00 0.00 0.00 0.00 0.00 0.00 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 1348.00 0.00 201.67 68.33 99392.00 34816.17 994.13 2.18 8.20 6.81 12.31 3.00 81.07 sdb 0.00 1352.00 0.33 267.33 1.33 133290.83 995.96 2.44 9.10 4.00 9.11 3.16 84.53 md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 md1 0.00 0.00 0.33 66.67 1.33 34133.33 1018.95 0.00 0.00 0.00 0.00 0.00 0.00 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 1874.67 2.33 291.33 1.67 138816.00 12.33 947.63 1.16 3.95 3.92 10.40 2.43 71.33 sdb 0.00 1881.00 0.00 291.00 0.00 138615.00 952.68 2.88 9.88 0.00 9.88 3.35 97.47 md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 md1 0.00 0.00 0.00 3.00 0.00 12.00 8.00 0.00 0.00 0.00 0.00 0.00 0.00 ``` 可以看到2MB的IO到达底层之后,会变成多个512KB的IO,平均队列长度约为3.3,硬盘的利用率大约88%。 备注:Linux系统中查看IO命令iostat。主要参数解释: ``` 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%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。 ```
暂无评论
添加新评论
称呼
Email
网站
取消回复
内容
发表评论