暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

由一起生产问题谈IO队列深度如何管理

开系植物园 2018-04-17
1316

前期生产环境发生一台SAN光纤交换机端口被隔离的问题,经分析原因为一台数据库服务器LUN队列深度设置了默认值,超过了盘机侧IO限制,在批量等大IO处理下,导致盘机侧IO堆积成为慢速设备触发保护性隔离,最终通过调低LUN队列深度,降低服务器对盘机的最大IOPS压力解决。

这个问题暴露出IO队列深入有效管理的必要性,下面展开做一个分析。

 

一、为何要设置IO队列深度

开放平台每台磁盘机一般在100-200T左右,正常情况下每台盘机能承受的总IOPS大概为50,000-100,000,如果总IOPS超过100,000,盘机性能会有明显下降。一般而言,一台盘机要分配给10-20台服务器共享使用,如果单台服务器IO压力过大,将会给盘机整体带来较大的压力,进而影响盘机上共享的其他应用性能。为此一般通过设置服务器IO队列深度,限制单台服务器的IO压力。

队列深度一般为LUN或者HBA卡的配置参数,为该设备能同时处理IO的最大并发数,即同时能处理的IO数量。举例来说,如果一个LUN每秒钟处理的IO数量为1000(即IOPS1000),处理每个IO需要的时间为0.01秒,那么同时处理的IO数为1000*0.01=10(个),即此时LUN的队列深度为10,可以用公式表述如下:

队列深度=IOPS* IO响应时间

  *这里IO响应时间单位为秒(s)

随着IOPS的增加,IO处理的响应时间也会随之变长,此时IO队列深度会迅速增加,导致盘机侧堆积的IO过多,存储性能降低。

默认情况下,生产中SuSE Linux环境的外置盘LUN队列深度为32,内置盘队列深度为256,光纤卡则无队列深度限制。

 

二、IO队列深度的建议配置

通过一个例子分析,假设一台服务器外置盘由100100GLUN组成,总容量为10T,对于不同的LUN队列深读参数设置影响如下:

1、如LUN队列深度为默认值32:当单块盘IOPS达到1000时,响应时间约为32ms,每块盘的队列深度达到阀值1000*0.032=32,服务器总IOPS1000*100=100,000。此时盘机整体压力将迅速增加,性能明显下降。

2、如果设置LUN队列深度为8:每块盘最大IOPS约为500IO响应时间也随之降为16msLUN队列深度达到阀值8。此时服务器总体IOPS500*100=50,000,对盘机总体的压力降低。

3、如果进一步将LUN队列深度设置为2:此时每块盘的队列深度约为250,此时响应时间约为8ms,服务器总体的IOPS25,000,对盘机的压力明显降低,不过服务器总体的IOPS也大受限制。

 

由此可见,当LUN队列深度设置为8,对服务器的IOPS限制、保障服务器IO处理是一个较为合理的设置。 

由于SuSE服务器外置盘数量一般不超过256块,故服务器总体队列深度为256*8=2048;如果服务器为2HBA卡,则每张卡的队列深度应不低于1024

如一台服务器光纤卡数量为N1LUN总数为N2,则服务器最大有效队列深度为min(1024*N1,8*N2) 

 另外在服务器总容量不变的前提下,调整单个LUN的大小,也可以达到改变整体IO队列深度的目的。如上面10T的环境,如为100100GLUN,则LUN总队列深度为800;如把LUN调整为101TLUN,总队列深度将降至80,最大IOPS也将随之明显降低。

 

三、设置IO队列深度的方法:

生产环境IO队列深度一般调整为光纤卡1024LUN队列深度为8。如下以SuSE为例说明队列深度的设置方法;

1、对于外置盘:

首先先确认光纤卡品牌,一般为Emulex或者Qlogic,方法是lspci|grep Fibre

1Emulex光纤卡:

a)确认当前队列深度 cat /etc/modprobe.conf.local

B) 查看是否有lun_queue_depth行,如有则修改参数,无则加入以下行(一般为LUN8 / HBA卡:1024)

echo "options lpfclpfc_lun_queue_depth=8" >>/etc/modprobe.conf.local

echo "options lpfclpfc_hba_queue_depth=1024" >>/etc/modprobe.conf.local

cd /boot

cp initrd-3.0.13-0.27-defaultinitrd-3.0.13-0.27-default.bak  #备份配置文件#

mkinitrd  #有多个warning:找不到分区的报错,无视#

C) reboot #重启服务器,并检查

cat/sys/module/lpfc/parameters/lpfc_lun_queue_depth

cat /sys/module/lpfc/parameters/lpfc_hba_queue_depth 

2Qlogic 光纤卡:仅设置LUN队列深度,HBA卡无法设置

(a)确认当前队列深度

cat /etc/modprobe.conf.local #检查是否有如下行,如没有则增加该行#

options qla2xxx ql2xmaxqdepth=8

视内核版本使设置永久生效

cd /boot

mkinitrd -k vmlinuz -i initrd-3.0.13-0.27-default

(b)重启服务器

PS  echo 8 > /sys/module/qla2xxx/parameters/ql2xmaxqdepth可以直接修改,不过重启后会失效 

2、对于内置盘:

队列深度的调整方法如下:

通过修改 /sys/block/<disk-name>/device/queue_depth 文件来修改,如修改sda64

echo 64 > /sys/block/sda/device/queue_depth

 

小结:IO性能的处理是影响运行效率的关键,其涉及服务器、光纤卡、LUN、磁盘机等各个层面的统筹协调,需要在深入研究各环节技术原理的基础上,找到匹配生产实践的最优配置,固化形成基线,并随着生产环境的变化不断优化。

 

 


文章转载自开系植物园,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论