DS4000做LVM Mirror时的IO暂停时间探讨
2008-11-10 08:25:31 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈囩磽瀹ュ拑韬€殿喖顭烽幃銏ゅ礂鐏忔牗瀚介梺璇查叄濞佳勭珶婵犲伣锝夘敊閸撗咃紲闂佺粯鍔﹂崜娆撳礉閵堝洨纾界€广儱鎷戦煬顒傗偓娈垮枛椤兘骞冮姀銈呯閻忓繑鐗楃€氫粙姊虹拠鏌ュ弰婵炰匠鍕彾濠电姴浼i敐澶樻晩闁告挆鍜冪床闂備浇顕栭崹搴ㄥ礃閿濆棗鐦遍梻鍌欒兌椤㈠﹤鈻嶉弴銏犵闁搞儺鍓欓悘鎶芥煛閸愩劎澧曠紒鈧崘鈹夸簻闊洤娴烽ˇ锕€霉濠婂牏鐣洪柡灞诲妼閳规垿宕卞▎蹇撴瘓缂傚倷闄嶉崝搴e垝椤栫偛桅闁告洦鍨扮粻鎶芥倵閿濆簼绨藉ù鐘荤畺濮婃椽妫冨☉娆愭倷闁诲孩鐭崡鎶芥偘椤曗偓瀹曞爼顢楁径瀣珫婵犳鍣徊鍓р偓绗涘洤绠查柛銉墮閽冪喖鏌i弬鎸庢喐闁荤喎缍婇弻娑⑩€﹂幋婵囩亪濡炪値鍓欓悧鍡涒€旈崘顔嘉ч幖绮光偓鑼嚬缂傚倷绶¢崰妤呭箰閹间焦鍋╅柣鎴f绾偓闂佺粯鍔曠粔闈浳涢崘顔兼槬闁逞屽墯閵囧嫰骞掗幋婵愪紑閻庤鎸风粈渚€鍩為幋锔藉亹闁圭粯甯╂导鈧紓浣瑰劤瑜扮偟鍒掑▎鎾宠摕婵炴垶鐭▽顏堟煙鐟欏嫬濮囨い銉︾箞濮婃椽鏌呴悙鑼跺濠⒀傚嵆閺岀喖鎼归锝呯3闂佹寧绻勯崑娑㈠煘閹寸姭鍋撻敐搴樺亾椤撴稒娅婇柡灞界У濞碱亪骞忕仦钘夊腐闂備焦鐪归崐鏇㈠箠閹邦喗顫曢柟鎯х摠婵挳鏌涢幘鏉戠祷闁告挸宕—鍐Χ閸℃浠搁梺鑽ゅ暱閺呮盯鎮鹃悜钘壩ㄧ憸澶愬磻閹剧粯鏅查幖绮瑰墲閻忓秹姊虹紒妯诲鞍婵炲弶锕㈡俊鐢稿礋椤栨氨鐤€闂傚倸鐗婄粙鎰姳閼测晝纾藉ù锝堟閻撴劖鎱ㄥΟ绋垮婵″弶鍔欓獮妯兼嫚閼碱剦妲伴梻浣稿暱閹碱偊宕愭繝姣稿洭寮舵惔鎾存杸濡炪倖姊婚妴瀣啅閵夛负浜滄い鎾跺仜濡插鏌i敐鍥у幋妤犵偞甯¢獮瀣籍閳ь剟鎮楁繝姘拺閻熸瑥瀚崕妤呮煕濡 鍋撻悢鎻掑緧婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繑銇勯幘鍗炵仼缁炬儳顭烽弻鐔煎礈瑜忕敮娑㈡煃闁垮鐏﹂柕鍥у楠炴帡宕卞鎯ь棜缂傚倸鍊风粈渚€藝闁秴鏋佸┑鐘虫皑瀹撲線鏌涢埄鍐姇闁稿﹦鍏橀弻娑樷攽閸℃浼€濡炪倖姊归崝鏇㈠煘閹达附鍊婚柛銉㈡櫇鏍¢梻浣告啞閹稿鎮烽敂鐣屸攳濠电姴娲﹂崵鍐煃閸濆嫬鏆熼柨娑欑矒濮婇缚銇愰幒鎴滃枈闂佸憡鐟ユ鎼佸煝閹炬枼鍫柛顐ゅ枔閸樻悂鏌h箛鏇炰户缁绢厼鐖煎畷鎴﹀箻鐠囪尙鐤€婵炶揪绲介幉锟犲磹椤栫偞鈷戠痪顓炴噹娴滃綊鎮跺☉鏍у姦闁糕斁鍋撳銈嗗笒閸燁偊鎯冨ú顏呯厸濞达絽婀辨晶顏堟煃鐟欏嫬鐏撮柟顔界懇瀵爼骞嬮悩杈敇闂傚倷绀佸﹢杈ㄧ仚闂佺濮ょ划搴ㄥ礆閹烘绫嶉柛顐ゅ枎娴犺櫣绱撴担鍓插創妞ゆ洘濞婇弫鍐磼濞戞艾骞堥梻浣告惈濞层垽宕濆畝鍕€堕柣妯肩帛閻撴洟鏌熼懜顒€濡煎ù婊勫劤閳规垿鏁嶉崟顐℃澀闂佺ǹ锕ラ悧鐘茬暦濠靛鏅濋柍褜鍓熼垾锕傚锤濡も偓閻掑灚銇勯幒宥堝厡缂佺姴澧介埀顒€鍘滈崑鎾斥攽閻樿京绐旈柛瀣殔閳规垿顢欑涵鐑界反濠电偛鎷戠徊鍨i幇鏉跨闁瑰啿纾崰鎾诲箯閻樼粯鍤戦柤绋跨仛濮f劙姊婚崒姘偓鐑芥嚄閼哥數浠氭繝鐢靛仜椤曨參宕楀Ο渚殨妞ゆ劑鍊栫€氭氨鈧懓澹婇崰鏍р枔閵婏妇绡€闁汇垽娼ф牎缂佺偓婢樼粔鐟邦嚕閺屻儱绠甸柟鐑樼箘閸炵敻鏌i悩鐑橆仩閻忓繈鍔岄蹇涘Ψ瑜夐崑鎾舵喆閸曨剙纰嶅┑鈽嗗亝缁诲倿锝炶箛娑欐優闁革富鍘鹃敍婊冣攽閳藉棗鐏犻柟纰卞亰閿濈偛顓奸崶鈺冿紳婵炶揪缍侀ˉ鎾诲礉瀹ュ鐓欑紒瀣仢閺嗛亶鏌i敐鍥у幋妤犵偛顑夐弫鍐焵椤掑倻涓嶅┑鐘崇閸嬶綁鏌涢妷鎴濆暟妤犲洭鎮楃憴鍕碍缂佸鎸抽垾鏃堝礃椤斿槈褔鏌涢埄鍏狀亪妫勫鍥╃=濞达絽澹婇崕鎰版煕閵娿儱顣崇紒顔碱儏椤撳吋寰勭€n亖鍋撻柨瀣ㄤ簻闁瑰搫绉堕ˇ锔锯偓娈垮枛閻忔繈鍩為幋锕€鐓¢柛鈩冾殘娴狀垶姊洪崨濠庣劶闁告洦鍙庡ú鍛婁繆閵堝繒鍒伴柛鐕佸灦瀹曟劙宕归锝呭伎濠碘槅鍨抽崢褎绂嶆ィ鍐╁€垫慨妯煎亾鐎氾拷

在通常的高可靠性要求下,一台DS4000的全冗余设计和RAID保护可以达到客户的要求。随着越来越多的客户对数据的安全性重视程度的加深和对业务连续性的要求的不断提升,客户需要一种全冗余的存储价格设计。例如,同时使用两台交换机,两个Fabric,任何一个出现故障IO都可用通过备份路径进行;同时使用两台DS4000,通过AIX操作系统的LVM Mirror来镜像两台DS4000中的数据,当任何一台DS4000失效后,应用仍然可以访问镜像盘;同时使用两台主机做HACMP,当一台主机运行的应用损坏后另外一台主机可以接管该应用。这个方案是名符其实的全冗余设计。以下是一个典型的连接拓普图:
如图示的拓普结构中,任何一台DS4000,交换机或主机光纤卡,主机失效,对应用都是透明的。但是如果应用的超时参数设置的非常短,就无法实现设计这个全冗余设计的初衷。所以应用的超时设计应该综合考虑所有部分的延时。本文将对整体延时的一部分——AIX的LVM Mirror的IO暂停时间进行讨论和分析。
本文将在单主机的情况下开展讨论。
讨论一:
任何一台DS4000存储服务器内的一个阵列(Array)失效,例如RAID5阵列中的两块硬盘同时离线。阵列处于不能访问状态。
在这种环境下,AIX的LVM Mirror通过与DS4000存储服务器的控制器进行通讯了解到阵列失效的情况,几秒钟后IO就继续与镜像的PV进行了。
注意:在创建Mirror VG的时候,Keep Quorum Checking On 参数应该设为no。而且Mirror VG建成以后应该重新varyoff,varyon这个VG来使这个设置生效。这个参数为yes时的意思是强制Mirror VG的成员总是同步,如果这样设置,那么一个当LVM 检测到一个PV损坏,就会挂起整个VG,IO将不会继续。
讨论二:
如果做LVM Mirror的主机有两块HBA卡,每块卡看到一台DS4000的两个控制器(拓普图如下),其中任何一块HBA损坏的时候,有哪些设置可以减少LVM Mirror暂停的时间呢?
在如图示的环境中,更改以下表格所列的设备的参数将有效的缩短LVM Mirror IO暂停的时间。
注意:在正常的应用环境中更改此参数对性能和稳定性没有影响。
设备 | 参数 | 默认属性 | 更改为 | 参数的含义 | 备注 |
dar | switch_retries | 5 | 0 | 重试与交换机连接的次数 | 更改为0将失去在线升级DS4000 控制器微码的功能 |
hdisk | rw_timeout | 30 | 10 | 每个读写操作超时的时长,单位是秒 | 每个pending的IO都需要等到超时才能通知LVM |
hdisk | reassign_to | 120 | 30 | 发现丢包后多长时间通知主机,单位是秒 | 允许的范围为0到1000秒 |
讨论三:
如果任何一台DS4000的电源全部损坏或主机端到光纤交换机的连接全部断掉,有哪些设置可以减少LVM Mirror IO暂停的时间呢?
在这个情形下,LVM Mirror IO暂停的时间将比前面两种讨论中的场景都有长:讨论一中LVM可以跟DS4000的控制器通讯,所以它清楚地知道PV坏,马上就可以做出只写镜像的PV的决定;讨论二中,LVM只要等到系统设备超时的报告就可以做出只写镜像的PV的决定;而讨论三的情形下,主机与DS4000之间有光纤交换机相隔,光纤交换机为确认端口设备变化而设置了重试次数和超时时间,所以IO暂停的时间相对前两种较长。
更改fscsi设备的参数将缩短LVM Mirror IO暂停的时间。
注意:此参数在一个DS4000控制器或一条通路失效的情况下也能减少切换时间。它需要交换机的支持,IBM的光纤交换机都支持这一设置,在2006年4月份的测试中,我们发现Qlogic SAN Box 5200不支持这一功能。将fscsi参数设为fast_fail对系统的性能和稳定性没有影响。
设备 | 参数 | 默认属性 | 更改为 | 参数的含义 | 备注 |
fscsi | fc_err_recov | delay_fail | fast_fail | 当交换机发现DS4000不在fabric上时,会通知主机的光纤接口卡,fast_fail的意思是当主机接到这个通知后马上fail掉所有对这个设备的IO | 这个设置在一个它DS4000控制器失效,而另一个控制器没有失效的环境下,对减少IO重新路由需要的时间有巨大的帮助 |
与讨论二相同的是主机端的参数设置应为:
设备 | 参数 | 默认属性 | 更改为 | 参数的含义 | 备注 |
dar | switch_retries | 5 | 0 | 重试与交换机连接的次数 | 更改为0将失去在线升级DS4000 控制器微码的功能 |
hdisk | rw_timeout | 30 | 10 | 每个读写操作超时的时长,单位是秒 | 每个pending的IO都需要等到超时才能通知LVM |
hdisk | reassign_to | 120 | 30 | 发现丢包后多长时间通知主机,单位是秒 | 允许的范围为0到1000秒 |
注意:在创建Mirror VG的时候,Keep Quorum Checking On 参数应该设为no。原因参见讨论一。
实例:
硬件环境:
pSeries 630, DS4500, DS4300Turbo 和2109-F16
软件环境:
AIX 5.2 ML6
devices.fcp.disk.array.rte 5.2.0.60
DS4500微码 06.12.03.00
DS4300Turbo微码 06.12.03.00
光纤交换机微码 v3.2.0
1. 每个交换机做两个Zone,连接图如下。
F16-1 zone 如下:
P630_fcs0_DS4500_CtlA1
P630_fcs0_DS4500_CtlB1
F16-2 zone 如下:
P630_fcs1_DS4300T_CtlA1
P630_fcs1_DS4300T_CtlB1
2. 在AIX中删除所有原有光纤设备,重新扫描cfgmgr,检查设备
lspv
fget_config -vA
看到dar0对于dac0/dac1,dar1对于dac2/dac3
3. 更改设备属性
chdev -l fscsi0 -a fc_err_recov=fast_fail -P
chdev -l fscsi1 -a fc_err_recov=fast_fail -P
chdev -l dar0 -a switch_retries=0
chdev -l dar1 -a switch_retries=0
chdev -l hdisk2 -a rw_timeout=10 --例如LUN_1为hdisk2
chdev -l hdisk2 -a reassign_to=30
chdev -l hdisk3 -a rw_timeout=10 --例如LUN_2为hdisk3
chdev -l hdisk3 -a reassign_to=30
注意:如果fscsi设备的属性无法设置,可以将它的子设备都置为define状态
rmdev - l hdisk2
rmdev - l hdisk3
rmdev - l dar0
rmdev - l dar1
rmdev - l dac0
rmdev - l dac1
rmdev - l dac2
rmdev - l dac3
然后运行:
chdev -l fscsi0 -a fc_err_recov=fast_fail -P
chdev -l fscsi1 -a fc_err_recov=fast_fail - P
最后运行:
cfgmgr
检查设备属性可以用命令:
lsattr - El device_name
4. 创建vg,lv,增加另一个lun到vg, 镜像vg,更改quorum属性, varyoffvg,varyonvg 来使quorum设置生效。
mkvg - y vg_name pv_name
mklv - y lv_name vg_name
extendvg - y vg_name new_pv_name
mirrorvg vg_name new_pv_name
chvg - Qn vg_name
varyoffvg vg_name
varyonvg vg_name
5. 用dd来测试一下对lv的读写,用iostat来监视到DS4000的IO。
写:
time dd if=/dev/zero of=/dev/rlv_name bs=1m count=2000 --写2GB的数据
iostat - a 1|grep fcs --如果fcs0和fcs1都有数据说明mirror成功
读:
time dd if=/dev/ rlv_name of=/dev/null bs=1m count=2000 --读2GB的数据
iostat - a 1|grep fcs --如果fcs0和fcs1都有数据说明mirror成功
6. 测试讨论一中的情况,Fail一个array
以读为例:
time dd if=/dev/ rlv_name of=/dev/null bs=1m count=2000 --读2GB的数据
iostat - a 1|grep fcs>scenario_1.txt --将IO情况输出到文件
当任务没有完成前在DS4000的Storage Manager中将一个Array中的两个HDD通过菜单设为advance→maintenance→fail drive
lsvg - p vg_name --查看一个PV的状态为missing
等到time dd…命令执行完成,用ctrl+c停止iostat,用vi打开scenario_1.txt文件,删掉有IO的行,仅保留IO暂停时的记录,数出行数并除以二。得到IO暂停的秒数。
7. 在DS4000的Storage Manager中将一个Array中的两个HDD 通过菜单advance→maintenance→revive drive 设为在线。
lsdev - Cc disk -- 检查相应的hdisk直到available
varyoffvg vg_name
varyonvg vg_name -- syncvg
lsvg - l vg_name -- 查看lv的状态是否是closed/sync
8. 测试讨论二中的情况,主机卡失效。
以读为例:
time dd if=/dev/ rlv_name of=/dev/null bs=1m count=2000 --读2GB的数据
iostat - a 1|grep fcs>scenario_2.txt --将IO情况输出到文件
当任务没有完成前将交换机上一个主机的接口disable或者拔这根光纤线,模拟主机卡失效。
lsvg - p vg_name --查看一个PV的状态为missing
等到time dd…命令执行完成,用ctrl+c停止iostat,用vi打开scenario_2.txt文件,删掉有IO的行,仅保留IO暂停时的记录,数出行数并除以二。得到IO暂停的秒数。
9. Enable交换机上disable的主机接口或者插上这根光纤线,模拟主机卡恢复健康。
lsdev - Cc disk -- 检查相应的hdisk直到available
varyoffvg vg_name
varyonvg vg_name -- syncvg
lsvg - l vg_name -- 查看lv的状态是否是closed/sync
10. 测试讨论三中的情况,一台DS4000失效。
以读为例:
time dd if=/dev/ rlv_name of=/dev/null bs=1m count=2000 --读2GB的数据
iostat - a 1|grep fcs>scenario_3.txt --将IO情况输出到文件
当任务没有完成前将交换机上所有这台DS4000的主机接口disable或者拔这些光纤线,模拟DS4000失效;也可以关掉DS4000的电源。
lsvg - p vg_name --查看一个PV的状态为missing
等到time dd…命令执行完成,用ctrl+c停止iostat,用vi打开scenario_3.txt文件,删掉有IO的行,仅保留IO暂停时的记录,数出行数并除以二。得到IO暂停的秒数。
11. Enable交换机上disable的DS4000的主机接口或者插上所有拔掉的光纤线,或是打开DS4000电源开关,模拟DS4000恢复健康。
lsdev - Cc disk -- 检查相应的hdisk直到available
varyoffvg vg_name
varyonvg vg_name -- syncvg
lsvg - l vg_name -- 查看lv的状态是否是closed/sync
更多精彩
赞助商链接