http://ju.outofmemory.cn/entry/140
最近遇到有些带MegaSAS RAID卡的服务器,在业务高峰时突然IO负载飚升得很高,IO性能急剧下降,查了日志及各种设置最后才发现是RAID卡的Cache写策略由WriteBack变成WriteThrough了。更深入的原因是BBU进入了Learn Cycle周期,自动把Cache策略改为WriteThrough.
在开始之前,我需要提到两个词: WriteBack, WriteThrough
对于LSI的MegaSAS RAID卡, 默认的Cache策略是: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
root@hostname:~ # ./MegaCli -LDInfo -Lall -aALL Adapter 0 -- Virtual Drive Information: Virtual Drive: 0 (Target Id: 0) Name : RAID Level : Primary-1, Secondary-0, RAID Level Qualifier-0 Size : 557.861 GB Mirror Data : 557.861 GB State : Optimal Strip Size : 128 KB Number Of Drives : 2 Span Depth : 1 Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU Current Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU Default Access Policy: Read/Write Current Access Policy: Read/Write Disk Cache Policy : Disabled Encryption Type : None Is VD Cached: No Exit Code: 0x00
由于MegaSAS RAID卡默认采用No Write Cache if Bad BBU的设置,将可能发生Write Cache策略变更的情况(由WriteBack变成WriteThrough),导致写性能下降,如果该自动变更发生在业务高峰且系统Io负载高的时候,可能会引发不可预测的问题,如卡机。以下原因将造成Write Cache策略的变更.
./MegaCli -LDSetProp CachedBadBBU -Lall -aALL ./MegaCli -LDSetProp WB -Lall -aALL #以下命令可以把设置修改回去 ./MegaCli -LDSetProp NOCachedBadBBU -Lall -aALL
BBU由锂离子电池和电子控制电路组成。 锂离子电池的寿命取决于其老化程度,从出厂之后,无论它是否被充电及它的充放电次数多与少,锂离子电池的容量将慢慢的减少。这意味着一个老电池无法像新电池那么持久。 也就决定了BBU的相对充电状态(Relative State of Charge)不会等于绝对充电状态(Absolute State of Charge)。
为了记录电池的放电曲线,以便控制器了解电池的状态,例如最大和最小电压等,同时为了延长电池的寿命,默认会启用自动校准模式(AutoLearn Mode). 在learn cycle期间, raid卡控制器不会启用BBU直到它完成校准。整个过程可能需要高达12小时。这个过程中,会禁用WriteBack模式,以保证数据完整性,同时会造成性能的降低. 整个Learn Cycle分为三个步骤:
注意: 如果第二或第三阶段被中断,重新校准的任务会停止,而不会重新执行
IBM的服务器默认设置是30天执行一次Learn Cycle, 而DELL是90天。不推荐关闭Auto Learn模式,通过这个校准,能延长电池寿命,不作电池校准的Raid卡,电池寿命将从正常的2年降为8个月
root@hostname:~ # ./MegaCli -AdpBbuCmd -GetBbuProperties -aALL BBU Properties for Adapter: 0 Auto Learn Period: 2592000 Sec Next Learn time: 394618008 Sec Learn Delay Interval:0 Hours Auto-Learn Mode: Enabled
实际时间计算方法,伪代码如下
RealTime = Next Learn time + ( 系统时间的Unixtime - RAID卡时间的Unixtime ) date -d 'UTC 2000-01-01 + $RealTime secs'
root@hostname:~ # MegaCli -AdpBbuCmd -GetBbuStatus -aALL BBU status for Adapter: 0 BatteryType: iBBU Voltage: 3837 mV Current: -152 mA Temperature: 23 C Battery State : Operational BBU Firmware Status: Charging Status : Discharging Voltage : OK Temperature : OK Learn Cycle Requested : Yes Learn Cycle Active : Yes Learn Cycle Status : OK Learn Cycle Timeout : No I2c Errors Detected : No Battery Pack Missing : No Battery Replacement required : No Remaining Capacity Low : No Periodic Learn Required : No Transparent Learn : No No space to cache offload : No Pack is about to fail & should be replaced : No Cache Offload premium feature required : No Module microcode update required : No ...下略...
强制执行自动校准的命令, 执行该命令后,会延迟几秒才会生效,策略会自动变为WriteThrough
root@hostname:~ # MegaCli -AdpBbuCmd -BbuLearn -aALL
通过该命令可以粗略的调整自动校准的下次执行时间,但无法100%准确:
对比Default Cache Policy和Current Cache Policy是否不同,不同则是策略发生变动
root@hostname:~ # MegaCli -LDInfo -Lall -aALL
echo 'autoLearnMode=1' >/tmp/megaraid.conf MegaCli -AdpBbuCmd -SetBbuProperties -f /tmp/megaraid.conf -aAll #1为Disable, 0为Enable, 从Disable切换到Enable时,Relearn操作会立刻执行 #确认是否生效 MegaCli -AdpBbuCmd -GetBbuProperties -aALL
推荐的Cache策略: 使用No Write Cache if Bad BBU,在BBU出问题的情况下,牺牲性能来确保数据的安全性。
WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
以下有几种可选的方法
推荐做法: 在保留Auto Learn模式的同时,定期通过Crontab对Raid卡执行强制Relearn的操作,检测下次Learn Cycle的时间,提前1~2天,在非业务高峰期提前触发learn cycle(一般是02:00~05:00)。