前期生产环境发生一台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(即IOPS为1000),处理每个IO需要的时间为0.01秒,那么同时处理的IO数为1000*0.01=10(个),即此时LUN的队列深度为10,可以用公式表述如下:
队列深度=IOPS* IO响应时间
*这里IO响应时间单位为秒(s)
随着IOPS的增加,IO处理的响应时间也会随之变长,此时IO队列深度会迅速增加,导致盘机侧堆积的IO过多,存储性能降低。
默认情况下,生产中SuSE Linux环境的外置盘LUN队列深度为32,内置盘队列深度为256,光纤卡则无队列深度限制。
二、IO队列深度的建议配置
通过一个例子分析,假设一台服务器外置盘由100块100G的LUN组成,总容量为10T,对于不同的LUN队列深读参数设置影响如下:
1、如LUN队列深度为默认值32:当单块盘IOPS达到1000时,响应时间约为32ms,每块盘的队列深度达到阀值1000*0.032=32,服务器总IOPS为1000*100=100,000。此时盘机整体压力将迅速增加,性能明显下降。
2、如果设置LUN队列深度为8:每块盘最大IOPS约为500,IO响应时间也随之降为16ms,LUN队列深度达到阀值8。此时服务器总体IOPS为500*100=50,000,对盘机总体的压力降低。
3、如果进一步将LUN队列深度设置为2:此时每块盘的队列深度约为250,此时响应时间约为8ms,服务器总体的IOPS为25,000,对盘机的压力明显降低,不过服务器总体的IOPS也大受限制。
由此可见,当LUN队列深度设置为8,对服务器的IOPS限制、保障服务器IO处理是一个较为合理的设置。
由于SuSE服务器外置盘数量一般不超过256块,故服务器总体队列深度为256*8=2048;如果服务器为2张HBA卡,则每张卡的队列深度应不低于1024。
如一台服务器光纤卡数量为N1,LUN总数为N2,则服务器最大有效队列深度为min(1024*N1,8*N2)。
另外在服务器总容量不变的前提下,调整单个LUN的大小,也可以达到改变整体IO队列深度的目的。如上面10T的环境,如为100块100G的LUN,则LUN总队列深度为800;如把LUN调整为10块1T的LUN,总队列深度将降至80,最大IOPS也将随之明显降低。
三、设置IO队列深度的方法:
生产环境IO队列深度一般调整为光纤卡1024,LUN队列深度为8。如下以SuSE为例说明队列深度的设置方法;
1、对于外置盘:
首先先确认光纤卡品牌,一般为Emulex或者Qlogic,方法是lspci|grep Fibre
(1)Emulex光纤卡:
a)确认当前队列深度 cat /etc/modprobe.conf.local
B) 查看是否有lun_queue_depth行,如有则修改参数,无则加入以下行(一般为LUN:8 / 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
(2)Qlogic 光纤卡:仅设置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 文件来修改,如修改sda为64:
echo 64 > /sys/block/sda/device/queue_depth。
小结:IO性能的处理是影响运行效率的关键,其涉及服务器、光纤卡、LUN、磁盘机等各个层面的统筹协调,需要在深入研究各环节技术原理的基础上,找到匹配生产实践的最优配置,固化形成基线,并随着生产环境的变化不断优化。