帮忙看看我的胸部正常吗这个IO吞吐量正常么

& Fio压测工具和io队列深度理解和误区
Fio压测工具和io队列深度理解和误区
原创文章,转载请注明: 转载自
本文链接地址:
Fio 是个强大的IO压力测试工具,我之前写过不少fio的使用和实践,参见 。
随着块设备的发展,特别是SSD盘的出现,设备的并行度越来越高。利用好这些设备,有个诀窍就是提高设备的iodepth, 一把喂给设备更多的IO请求,让电梯算法和设备有机会来安排合并以及内部并行处理,提高总体效率。
应用使用IO通常有二种方式:同步和异步。 同步的IO一次只能发出一个IO请求,等待内核完成才返回,这样对于单个线程iodepth总是小于1,但是可以透过多个线程并发执行来解决,通常我们会用16-32根线程同时工作把iodepth塞满。 异步的话就是用类似libaio这样的linux native aio一次提交一批,然后等待一批的完成,减少交互的次数,会更有效率。
io队列深度通常对不同的设备很敏感,那么如何用fio来探测出合理的值呢?
让我们先来看下和iodepth相关的参数:
iodepth=int
Number of I/O units to keep in flight against the file. Note that increasing iodepth beyond
synchronous
for small degress when verify_async is in use). Even async engines my impose OS restrictions causing the desired depth not to be
This may happen on Linux when using libaio and not setting direct=1, since buffered IO is not async on that OS. Keep an eye on
the IO depth distribution in the fio output to verify that the achieved depth is as expected. Default:
iodepth_batch=int
Number of I/Os to submit at once.
Default: iodepth.
iodepth_batch_complete=int
This defines how many pieces of IO to retrieve at once. It defaults to 1 which
that we’ll ask for a minimum of 1 IO in the retrieval process from the kernel. The IO retrieval will go on until we hit the limit
set by iodepth_low. If this variable is set to 0, then fio will always check for completed events before
reduce IO latency, at the cost of more retrieval system calls.
iodepth_low=int
Low watermark indicating when to start filling the queue again.
Default: iodepth.
direct=bool
If true, use non-buffered I/O (usually O_DIRECT).
Default: false.
How many I/Os to perform before issuing an fsync(2) of dirty data.
If 0, don’t sync.
Default: 0.
这几个参数在libaio的引擎下的作用,文档写的挺明白,但容我再罗嗦下IO请求的流程:
libaio引擎会用这个iodepth值来调用io_setup准备个可以一次提交iodepth个IO的上下文,同时申请个io请求队列用于保持IO。 在压测进行的时候,系统会生成特定的IO请求,往io请求队列里面扔,当队列里面的IO个数达到iodepth_batch值的时候,就调用io_submit批次提交请求,然后开始调用io_getevents开始收割已经完成的IO。 每次收割多少呢?由于收割的时候,超时时间设置为0,所以有多少已完成就算多少,最多可以收割iodepth_batch_complete值个。随着收割,IO队列里面的IO数就少了,那么需要补充新的IO。 什么时候补充呢?当IO数目降到iodepth_low值的时候,就重新填充,保证OS可以看到至少iodepth_low数目的io在电梯口排队着。
注意:这些参数在文档里面描述的有点小问题,比如说默认值什么的是不太对的,所以我的建议是这些参数要去显示的写。
如何确认fio安装我们的配置在工作呢? fio提供了诊断办法 --debug=io ,我们来演示下:
# cat nvdisk-test
ioengine=libaio
userspace_reap
rwmixwrite=20
time_based
runtime=180
group_reporting
randrepeat=0
norandommap
ramp_time=6
iodepth=16
iodepth_batch=8
iodepth_low=8
iodepth_batch_complete=8
filename=/dev/nvdisk0
fio任务配置里面有几个点需要非常注意:
1. libaio工作的时候需要文件direct方式打开。
2. 块大小必须是扇区(512字节)的倍数。
3. userspace_reap提高异步IO收割的速度。
4. ramp_time的作用是减少日志对高速IO的影响。
5. 只要开了direct,fsync就不会发生。
# fio nvdisk-test --debug=io
fio: set debug option io
22441 load ioengine libaio
22441 load ioengine libaio
test: (g=0): rw=randrw, bs=512-512/512-512, ioengine=libaio, iodepth=16
Starting 1 process
22444 invalidate cache /dev/nvdisk0: 0/
22444 fill_io_u: io_u 0x6d3210: off=/len=512/ddir=0//dev/nvdisk0
22444 prep: io_u 0x6d3210: off=/len=512/ddir=0//dev/nvdisk0
22444 -&prep(0x6d3210)=0
22444 queue: io_u 0x6d3210: off=/len=512/ddir=0//dev/nvdisk0
22444 fill_io_u: io_u 0x6d2f80: off=/len=512/ddir=0//dev/nvdisk0
22444 prep: io_u 0x6d2f80: off=/len=512/ddir=0//dev/nvdisk0
22444 -&prep(0x6d2f80)=0
22444 queue: io_u 0x6d2f80: off=/len=512/ddir=0//dev/nvdisk0
22444 fill_io_u: io_u 0x6d2cb0: off=/len=512/ddir=0//dev/nvdisk0
22444 prep: io_u 0x6d2cb0: off=/len=512/ddir=0//dev/nvdisk0
22444 -&prep(0x6d2cb0)=0
22444 queue: io_u 0x6d2cb0: off=/len=512/ddir=0//dev/nvdisk0
22444 fill_io_u: io_u 0x6d29a0: off=/len=512/ddir=0//dev/nvdisk0
22444 prep: io_u 0x6d29a0: off=/len=512/ddir=0//dev/nvdisk0
22444 -&prep(0x6d29a0)=0
22444 queue: io_u 0x6d29a0: off=/len=512/ddir=0//dev/nvdisk0
22444 fill_io_u: io_u 0x6d2710: off=/len=512/ddir=0//dev/nvdisk0
22444 prep: io_u 0x6d2710: off=/len=512/ddir=0//dev/nvdisk0
22444 -&prep(0x6d2710)=0
22444 queue: io_u 0x6d2710: off=/len=512/ddir=0//dev/nvdisk0
22444 fill_io_u: io_u 0x6d2400: off=/len=512/ddir=0//dev/nvdisk0
22444 prep: io_u 0x6d2400: off=/len=512/ddir=0//dev/nvdisk0
22444 -&prep(0x6d2400)=0
22444 queue: io_u 0x6d2400: off=/len=512/ddir=0//dev/nvdisk0
22444 fill_io_u: io_u 0x6d2130: off=/len=512/ddir=0//dev/nvdisk0
22444 prep: io_u 0x6d2130: off=/len=512/ddir=0//dev/nvdisk0
22444 -&prep(0x6d2130)=0
22444 queue: io_u 0x6d2130: off=/len=512/ddir=0//dev/nvdisk0
22444 fill_io_u: io_u 0x6d1ea0: off=/len=512/ddir=0//dev/nvdisk0
22444 prep: io_u 0x6d1ea0: off=/len=512/ddir=0//dev/nvdisk0
22444 -&prep(0x6d1ea0)=0
22444 queue: io_u 0x6d1ea0: off=/len=512/ddir=0//dev/nvdisk0
22444 calling -&commit(), depth 8
22444 fill_io_u: io_u 0x6d1b90: off=/len=512/ddir=0//dev/nvdisk0
22444 prep: io_u 0x6d1b90: off=/len=512/ddir=0//dev/nvdisk0
22444 -&prep(0x6d1b90)=0
22444 queue: io_u 0x6d1b90: off=/len=512/ddir=0//dev/nvdisk0
22444 fill_io_u: io_u 0x6cdfa0: off=/len=512/ddir=0//dev/nvdisk0
我们可以看到详细的IO工作过程,这个方法不需要对OS非常的熟悉,比较实用。
还有个方法就是透过strace来跟踪系统调用的情况, 更直观点。
# pstree -p
init(1)─┬─agent_eagleye(22296)
├─screen(13490)─┬─bash(18324)─┬─emacs(19429)
├─emacs(20365)
├─emacs(21268)
├─fio(22452)─┬─fio(22454)
└─{fio}(22453)
└─man(20385)───sh(20386)───sh(20387)───less(20391)
├─sshd(1834)───sshd(13115)───bash(13117)───screen(13662)
└─udevd(705)─┬─udevd(1438)
└─udevd(1745
# strace -p 22454
io_submit(416, 8, {{(nil), 0, 1, 0, 3}, {(nil), 0, 0, 0, 3}, {(nil), 0, 0, 0, 3}, {(nil), 0, 0, 0, 3}, {(nil), 0, 0, 0, 3}, {(nil), 0, 1, 0, 3}, {(nil), 0, 1, 0, 3}, {(nil), 0, 0, 0, 3}}) = 8
io_getevents(416, 8, 8, {{(nil), 0x6d, 0}, {(nil), 0x6d2f80, 512, 0}, {(nil), 0x6d2cb0, 512, 0}, {(nil), 0x6d29a0, 512, 0}, {(nil), 0x6d, 0}, {(nil), 0x6d, 0}, {(nil), 0x6d, 0}, {(nil), 0x6d1ea0, 512, 0}}, NULL) = 8
最后有效的一招就是用iostat -dx 1来确认你的iodepth是符合设备特性的。
(由于我用的是nvram卡,这个卡的设备驱动没有队列,iostat看不到队列深度,就用了其他的设备的图代替,表明可以用看iostat看IO队列深度,谢谢网友Uranus指出)
通过这些方法确认你的配置是对的,之后分析出来的数据才会有意义。
祝玩得开心!
Post Footer automatically generated by
for wordpress.
Related posts:
Categories:
buy me a coffee.
阿里核心系统数据库组招募高手!
招聘信息:
Recent Posts【陕西一区】大神们帮忙看看这个io1.1真的么假的。。。_cf陕西一区吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:24,331贴子:
【陕西一区】大神们帮忙看看这个io1.1真的么假的。。。
屌丝终于盼来了宿舍连网...
外观简直吊炸天,土豪必...
我想入手一款雷蛇的鼠标...
。。。他是谁?难道是国...
开个外挂流弊什么
楼主晚上通宵,没想到竟...
id. 呆呆童鞋 有意好友
没见过黄色的主板
说实话 我确实想你 也确实想睡你 但我更想每天睡醒后还有你
白龙马,蹄朝西 吧主转眼又封了仨水比 水点经验不容易 容易成不了大水比 什么吧规置顶, 什么黑屋十循。 什么刀山火海, 什么永久封禁。 都挡不住日水三千大水比 水了就到十八级!!
一款真正“球迷做给球迷”的足球类游戏!
真的假不了,假的真不了。
贴吧神吐槽,不吐不快!
邮过来我给你看看
真板子的颜色很假的不一样
我们无法预知未来,但正因为未来充满了各种变数,生活才变得有意义。
假的,主板不对
假的,不过现在都是这样,能用就行了,反正100来块钱
这也太假了,这么垃圾的高仿,赶紧退了去,这种鼠标就么办法玩
内&&容:使用签名档&&
保存至快速回贴VC &&&&最新内容
VC &&&&随机内容说说IO(三)- IO性能的重要指标 - 和你在一起 - ITeye技术网站
博客分类:
最重要的三个指标
IOPS,即每秒钟处理的IO请求数量。IOPS是随机访问类型业务(OLTP类)很重要的一个参考指标。
一块物理硬盘能提供多少IOPS?
从磁盘上进行数据读取时,比较重要的几个时间是:寻址时间(找到数据块的起始位置),旋转时间(等待磁盘旋转到数据块的起始位置),传输时间(读取数据的时间和返回的时间)。其中寻址时间是固定的(磁头定位到数据的存储的扇区即可),旋转时间受磁盘转速的影响,传输时间受数据量大小的影响和接口类型的影响(不用硬盘接口速度不同),但是在随机访问类业务中,他的时间也很少。因此,在硬盘接口相同的情况下,IOPS主要受限于寻址时间和传输时间。以一个15K的硬盘为例,寻址时间固定为4ms,传输时间为60s/=2ms,忽略传输时间。1000ms/6ms=167个IOPS。
OS的一次IO请求对应物理硬盘一个IO吗?
在没有文件系统、没有VM(卷管理)、没有RAID、没有存储设备的情况下,这个答案还是成立的。但是当这么多中间层加进去以后,这个答案就不是这样了。物理硬盘提供的IO是有限的,也是整个IO系统存在瓶颈的最大根源。所以,如果一块硬盘不能提供,那么多块在一起并行处理,这不就行了吗?确实是这样的。可以看到,越是高端的存储设备的cache越大,硬盘越多,一方面通过cache异步处理IO,另一方面通过盘数增加,尽可能把一个OS的IO分布到不同硬盘上,从而提高性能。文件系统则是在cache上会影响,而VM则可能是一个IO分布到多个不同设备上(Striping)。
所以,一个OS的IO在经过多个中间层以后,发生在物理磁盘上的IO是不确定的。可能是一对一个,也可能一个对应多个。
IOPS能算出来吗?
对单块磁盘的IOPS的计算没有没问题,但是当系统后面接的是一个存储系统时、考虑不同读写比例,IOPS则很难计算,而需要根据实际情况进行测试。主要的因素有:
存储系统本身有自己的缓存。缓存大小直接影响IOPS,理论上说,缓存越大能cache的东西越多,在cache命中率保持的情况下,IOPS会越高。
RAID级别。不同的RAID级别影响了物理IO的效率。
读写混合比例。对读操作,一般只要cache能足够大,可以大大减少物理IO,而都在cache中进行;对写操作,不论cache有多大,最终的写还是会落到磁盘上。因此,100%写的IOPS要越狱小于100%的读的IOPS。同时,100%写的IOPS大致等同于存储设备能提供的物理的IOPS。
一次IO请求数据量的多少。一次读写1KB和一次读写1MB,显而易见,结果是完全不同的。
当时上面N多因素混合在一起以后,IOPS的值就变得扑朔迷离了。所以,一般需要通过实际应用的测试才能获得。
IO Response Time
即IO的响应时间。IO响应时间是从操作系统内核发出一个IO请求到接收到IO响应的时间。因此,IO Response time除了包括磁盘获取数据的时间,还包括了操作系统以及在存储系统内部IO等待的时间。一般看,随IOPS增加,因为IO出现等待,IO响应时间也会随之增加。对一个OLTP系统,10ms以内的响应时间,是比较合理的。下面是一些IO性能示例:
一个8K的IO会比一个64K的IO速度快,因为数据读取的少些。
一个64K的IO会比8个8K的IO速度快,因为前者只请求了一个IO而后者是8个IO。
串行IO会比随机IO快,因为串行IO相对随机IO说,即便没有Cache,串行IO在磁盘处理上也会少些操作。
需要注意,IOPS与IO Response
Time有着密切的联系。一般情况下,IOPS增加,说明IO请求多了,IO Response Time会相应增加。但是会出现IOPS一直增加,但是IO Response Time变得非常慢,超过20ms甚至几十ms,这时候的IOPS虽然还在提高,但是意义已经不大,因为整个IO系统的服务时间已经不可取。
Throughput
为吞吐量。这个指标衡量标识了最大的数据传输量。如上说明,这个值在顺序访问或者大数据量访问的情况下会比较重要。尤其在大数据量写的时候。
吞吐量不像IOPS影响因素很多,吞吐量一般受限于一些比较固定的因素,如:网络带宽、IO传输接口的带宽、硬盘接口带宽等。一般他的值就等于上面几个地方中某一个的瓶颈。
IO Chunk Size
即单个IO操作请求数据的大小。一次IO操作是指从发出IO请求到返回数据的过程。IO Chunk Size与应用或业务逻辑有着很密切的关系。比如像Oracle一类数据库,由于其block size一般为8K,读取、写入时都此为单位,因此,8K为这个系统主要的IO
Chunk Size。IO Chunk Size
小,考验的是IO系统的IOPS能力;IO Chunk Size大,考验的时候IO系统的IO吞吐量。
Queue Deep
熟悉数据库的人都知道,SQL是可以批量提交的,这样可以大大提高操作效率。IO请求也是一样,IO请求可以积累一定数据,然后一次提交到存储系统,这样一些相邻的数据块操作可以进行合并,减少物理IO数。而且Queue Deep如其名,就是设置一起提交的IO请求数量的。一般Queue Deep在IO驱动层面上进行配置。
Queue Deep与IOPS有着密切关系。Queue Deep主要考虑批量提交IO请求,自然只有IOPS是瓶颈的时候才会有意义,如果IO都是大IO,磁盘已经成瓶颈,Queue Deep意义也就不大了。一般来说,IOPS的峰值会随着Queue
Deep的增加而增加(不会非常显著),Queue Deep一般小于256。
随机访问(随机IO)、顺序访问(顺序IO)
随机访问的特点是每次IO请求的数据在磁盘上的位置跨度很大(如:分布在不同的扇区),因此N个非常小的IO请求(如:1K),必须以N次IO请求才能获取到相应的数据。
顺序访问的特点跟随机访问相反,它请求的数据在磁盘的位置是连续的。当系统发起N个非常小的IO请求(如:1K)时,因为一次IO是有代价的,系统会取完整的一块数据(如4K、8K),所以当第一次IO完成时,后续IO请求的数据可能已经有了。这样可以减少IO请求的次数。这也就是所谓的预取。
随机访问和顺序访问同样是有应用决定的。如数据库、小文件的存储的业务,大多是随机IO。而视频类业务、大文件存取,则大多为顺序IO。
选取合理的观察指标:
以上各指标中,不用的应用场景需要观察不同的指标,因为应用场景不同,有些指标甚至是没有意义的。
随机访问和IOPS: 在随机访问场景下,IOPS往往会到达瓶颈,而这个时候去观察Throughput,则往往远低于理论值。
顺序访问和Throughput:在顺序访问的场景下,Throughput往往会达到瓶颈(磁盘限制或者带宽),而这时候去观察IOPS,往往很小。
寻址时间固定为4ms,传输时间为60s/=2ms
这个传输时间应该是旋转时间.
1/2应该是平均旋转时间吧
希望博主能把IO的这系列文章再做成PDF。
和你在一起
浏览: 236253 次
来自: 北京
引用计数法可以解决大多数情况地垃圾回收,其实我地建议是通常使用 ...
漂泊一剑客 写道all_wmh 写道有个疑惑:&整个 ...
楼主好久不写了貌似
楼主分析得很到位,选择淘宝是对的。相关阅读:u站联盟http: ...}

我要回帖

更多关于 系统吞吐量 多少正常 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信