IO队列深度max_queue_depth对系统性能的影响
前段时间,发生了一个问题引起了我对IO队列深度的研究。
存储服务器中linux kernel的mpt2sas驱动模块,将max_queue_depth设置为1024时,引起系统加载驱动时卡死,而调整为512则没问题。
后来看了很多这方面的资料,终于弄明白了。
我们为了追求系统的性能,往往将max_queue_depth设置的很大。但是并不是越大对性能越有帮助。
以下内容全部出自转载,我偷下懒!
(1)
探秘I/O队列对磁盘性能的影响
转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese
介绍
信息传输过程中数据通常暂存于磁盘队列。实验表明,随着服务器性能的不断提高,磁盘I/O队列常常成为影响磁盘响应速度的首要瓶颈。本文以AIX系统为例,描述了I/O队列在磁盘中的工作原理、监测命令,以及如何对其进行优化以提升磁盘性能。
使用I/O队列的意义:
为何要对磁盘I/O进行并行处理呢?主要目的是提升应用程序的性能。这一点对于多物理磁盘组成的虚拟磁盘(或LUN)显得尤为重要。如果一次提交一个I/O,虽然响应时间较短,但系统的吞吐量很小。相比较而言,一次提交多个I/O既缩短了磁头移动距离(通过电梯算法),同时也能够提升IOPS。假如一部电梯一次只能搭乘一人,那么每个人一但乘上电梯,就能快速达到目的地(响应时间),但需要耗费较长的等待时间(队列长度)。因此一次向磁盘系统提交多个I/O能够平衡吞吐量和整体响应时间。
理论上,磁盘的IOPS取决于队列长度÷平均IO响应时间。假设队列长度为3,平均IO响应时间是10ms,则最大吞吐量是300 IOPS。
IO队列位于何处:
以AIX系统为例,从应用层到磁盘物理层的IO堆栈如下所示,IO按照从上至下的顺序遍历堆栈:
- 应用程序层
- 文件系统层(可选)
- LVM设备驱动层(可选)
- SDD或SDDPCM或其他多路径驱动层(如果使用)
- hdisk设备驱动层
- adapter设备驱动层
- 磁盘接口层
- 磁盘子系统层
- 磁盘层
AIX在每一层堆栈都会监测IO,因此堆栈的每一层都有IO队列。通常,如果当前各层执行的IO 超过了队列长度所限制的最大数量,这些IO将暂存于等待队列中,直至获取申请资源。在文件系统层,文件系统缓存限制了各文件系统的最大可执行IO数量。 LVM设备驱动层,可执行的最大IO数量受hdisk缓存的限制。在SDD层,如果dpo设备的qdepth_enable属性设置成yes,则会建立 IO队列,但也有些版本无法设置队列。SDDPCM在将IO发送至磁盘设备驱动层之前没有进行队列处理。hdisk通过queue_depth参数设置最大响应IO数量, 而FC适配层的参数为num_cmd_elems。磁盘子系统层有IO队列,单块物理磁盘可接收多个IO请求但一次只能处理一个IO。
IO队列监测命令:
以AIX为例,AIX 5.3及以上版本,可用iostat和sar –d命令监测hdisk队列,iostat -D命令输出如下:
hdisk6 xfer: %tm_act bps tps bread bwrtn
4.7 2.2M 19.0 0.0 2.2M
read: rps avgserv minserv maxserv timeouts fails
0.0 0.0 0.0 0.0 0 0
write: wps avgserv minserv maxserv timeouts fails
19.0 38.9 1.1 190.2 0 0
queue: avgtime mintime maxtime avgwqsz avgsqsz sqfull
15.0 0.0 83.7 0.0 0.0 136
这里,avgwqsz是平均等待队列长度,avgsqsz是平均响应队列长度。在等待队列中花费的平均等待时间是avgtime。sqfull值代表每秒钟向已满队列提交的IO数。对于有cache的磁盘子系统,IO响应时间会有所不同。iostat –D命令显示的是系统从启动后的统计数据。
从应用程序的角度来看,处理IO的总时间是响应时间加上在hdisk等待队列中的时间。
sar –d命令输出如下:
16:50:59 device %busy avque r+w/s Kbs/s avwait avserv
16:51:00 hdisk1 0 0.0 0 0 0.0 0.0
hdisk0 0 0.0 0 0 0.0 0.0
avwait和avserv分别是花费在等待队列和响应队列的时间,avque在AIX 5.3以上版本中,代表等待队列中的平均IO数量。
优化方法:
首先,不应盲目增加以上队列参数值。这样有可能造成磁盘子系统过载或在启动时引起设备配置报错。因此,仅增加hdisk
的queue_depths值并不是最好的方法,而应该同时调整可提交最大IO数量。当queue_depths和发送至磁盘子系统的IO数量同时增加
时,IO响应时间可能会增加,但同时吞吐量也得到了提升。当IO响应时间接近磁盘超时时间,则说明所提交IO超过了磁盘能够处理的界限。如果看到IO超时
并在错误日志中报出IO无法完成,说明可能有硬件问题,或需要缩短队列。
调整queue_depths的一条法则是:对于随机读写或队列未满的情况,如果IO响应时间超过15ms,就不能再增加queue_depths值。一旦IO响应时间增加,瓶颈就从磁盘和adapter队列转移至磁盘子系统。调整队列长度应依据:1)实际应用程序产生的IO请求数,2)使用测试工具以观察磁盘子系统的处理能力。其中,1)为主要依据。
IO队列有以下四种状态:
- 队列已满,IO等在hdisk或adapter驱动层
- 队列未满,IO响应时间短
- 队列未满,IO响应时间长
- 队列未满,IO提交速度快于存储处理速度并导致IO丢失
我们需要把队列调整为2或3的状态。情况3表明瓶颈不在hdisk驱动层,而很有可能在磁盘子系统自身,也有可能位于adapter驱动层或SAN。
第4种情况是应该避免的。受限于存储IO请求和数据的内存大小,所有磁盘和磁盘子系统都有IO执行数量的限制。当存储丢失IO时,主机端超时,IO将被重新提交,同时等待该IO的事件将被暂停。CPU为了处理IO多做了很多事情,这种情况应该避免。如果IO最终失败,将会导致应用程序崩溃或更严重的结果。所以必须仔细确认存储的处理极限。
合理的平均IO响应时间:
假设队列中没有IO,一次读操作将会占据0至15ms,取决于寻址时间,磁盘转速,以及数据传输时间。之后数据从存储移动至主机。有时数据位于磁盘读缓存,这种情况下IO响应时间约为1ms。对于大型磁盘系统在正常工作状态下,平均IO响应时间约为5-10ms。当随机读取小数据耗时超过15ms时,表明存储较为繁忙。
写操作通常将数据写入cache中,平均耗时不到2.5ms。但是也有例外:如果存储同步将数据镜像至远端,写操作将耗费更长时间。如果写入数据量较大(多于64KB)则数据传输时间会显著增加。没有cache的情况下,写时间的读时间差不多。
如果IO是大块顺序读写,除了传输时间较长,IO会暂存于磁盘物理层队列,IO响应时间远高于平均值。例如:应用提交50个IO(50个64KB顺序读),最初几个IO会获得较快的响应时间,而最后一个IO必须等待其他49个完成,从而耗费很长的响应时间。
(2)
| queue_depth参数大小 | |||
|
queue_depth参数会影响disk i/o性能,特别是在数据库等i/o密集性应用中。适当调整设置此参数,会提高整体应用的性能。下面是在AIX 5.3,IBM ds4300上调整此参数的步骤及注意事项,记录一下。
下面物理磁盘hdisk2是基于IBM存储上的,做的raid 5,此盘属于vg datavg中。
一,首先备份datavg.在生产环境作任何调整,一定要切记安全第一,备份是必不可少的。
#smit savevg
二,查看所需修改的hdisk2上queue_depth的值。
#lsattr -El hdisk2|grep queue_depth
三,首先umount datavg上的文件系统。
#umount /u2
四,vary off vg。
#varyoffvg datavg
五,删除磁盘hdisk2.
#rmdev -l hdisk2
六,修改磁盘hdisk2 queue_depth参数.
#chdev -l hdisk2 -a queue_depth=16(此值为所需修改的具体queue_depth值) -P
七,增加磁盘hdisk2.
#mkdev -l hdisk2
八,vary on vg.
#varyonvg datavg
九,mount datavg上文件系统
#mount /u2
十,最后查看一下queue_depth参数是否修改成功。
#lsattr -El hdisk2|grep queue_depth
如上面查看queue_depth值已变成所需值,则整个过程完成。如有条件,最好能重?一下机器。应注意的是此值如设置不合理,可能会导致系统hang住,或死机现象。
IO队列深度max_queue_depth对系统性能的影响的更多相关文章
- IO队列和IO调度
IO体系概览 先看看本文主题IO调度和IO队列处于整个IO体系的哪个位置,这个IO体系是非常重要的,了解IO体系我们可以对整个IO过程有个全面的认识.虽然一下两下并不清楚IO体系各个部分的细节,但是我 ...
- usdt节点启动慢和队列深度超出了范围问题
usdt节点启动慢和队列深度超出了范围问题 usdt的连接节点报错Work queue depth exceeded(队列深度超出了范围)大概是什么问题?重启了几次节点都不行队列深度超出了范围,估计是 ...
- 条带深度 队列深度 NCQ IOPS
http://blog.csdn.net/striping/article/details/17449653 IOPS 即I/O per second,即每秒进行读写(I/O)操作的次数,多用于数据库 ...
- 网络损伤仪WANsim的队列深度功能
什么是队列深度 在网络损伤仪WANsim中,队列是指一个用于缓存报文的缓冲池.深度是指缓冲池可以存储的最大数据量.当WANsim接受的报文超出了带宽限制的量时,溢出的报文会进入队列中. 我们可以在WA ...
- MQ中间件死信队列深度不断增加问题解决案例
感谢作者: http://www.wo81.com/tec/mid/mq/2014-04-14/94.html MQ中间件死信队列深度不断增加问题解决案例 ❞ ☜ ☞ 作者:彭新 日期:2014-0 ...
- Log4J对系统性能的影响
Log4J对系统性能的影响 主要体现: 1.日志输出的目的地,输出到控制台的速度比输出到文件系统的速度要慢. 2.日志输出格式不一样对性能也会有影响,如简单输出布局(SimpleLayout)比格式化 ...
- linux audit审计(8)--开启audit对系统性能的影响
我们使用测试性能的工具,unixbench,它有一下几项测试项目: Execl Throughput 每秒钟执行 execl 系统调用的次数 Pipe Throughput 一秒钟内一个进程向一个管道 ...
- 图像Resize方式对深度学习模型效果的影响
在基于卷积神经网络的应用过程中,图像Resize是必不可少的一个步骤.通常原始图像尺寸比较大,比如常见监控摄像机出来的是1080P高清或者720P准高清画面,而网络模型输入一般没有这么大,像Yolo系 ...
- 吞吐量(Throughput)、QPS、并发数、响应时间(RT)对系统性能的影响
首先对吞吐量().QPS.并发数.响应时间(RT)几个概念一直比较模糊,也不知道哪些指标可以较好的衡量系统的性能.今天特意查了些资料做一些记录:首先看一些概念(来自百度百科) 1. 响应时间(RT) ...
随机推荐
- 从数组中取出N个元素的所有组合——递归实现
https://www.cnblogs.com/null00/archive/2012/04/27/2473788.html 今天在做POJ 1753时,需要枚举一个数组中所有组合.之前也遇到过类似的 ...
- js date setInterval 时间 时钟 getFullYear ,JavaScript
js 创建时钟: 1.参考链接: 注意 getYear (两位 或者 四位) 改成 getFullYear js操作时间 2.实例: html: <span class="glyp ...
- Linux 常用命令和使用技巧
一.Shell命令 shell通配符------"*"."?"."[]" shell管道-------|把命令连接起来,把第一个命令的输出作 ...
- linux 保存git的账号密码
今天在弄jenkins一建发版,遇到了git下载每次都要输入账号密码,所以百度一下,使用一下方法,搞定 一.通过文件方式 1.在~/下, touch创建文件 .git-credentials, 用vi ...
- mysql 数据库查看表的信息
查看正在改动的数据库: 1. select database(); 2. status; 查看表的结构: desc table_name show columns from table_name ...
- webstorm 2018 LICENSE SERVER 最新激活网址
2018年8月更新:https://s.tuzhihao.com:666 (亲测)
- Spring ConditionalOnProperty
Spring Annotation @ConditionalOnProperty spring doc解释 @Conditional: Indicates that a component is on ...
- poj 3347
#include <cstring> #include <iostream> #include <cstdlib> #include <iomanip> ...
- C++ operator 学习
1.概述 1.1what operator 是c++的一个关键字,和运算符如(=)一起使用,表示一个运算符重载函数 1.2why 对于C++提供的所有操作符,通常只支持对于基本数据类型和标准库中提供的 ...
- XSS(四)攻击防御
XSS Filter XSS Filter的作用是过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果 XSS Filter作为防御跨站攻击的主要手段之一,已经广泛应用在各类Web系统之中, ...