最近遇到有些带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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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策略的变更.
1
2
3
4
|
.
/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个月
1
2
3
4
5
6
7
|
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
|
实际时间计算方法,伪代码如下
1
2
|
RealTime = Next Learn
time
+ ( 系统时间的Unixtime - RAID卡时间的Unixtime )
date
-d
'UTC 2000-01-01 + $RealTime secs'
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
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
1
|
root@
hostname
:~
# MegaCli -AdpBbuCmd -BbuLearn -aALL
|
通过该命令可以粗略的调整自动校准的下次执行时间,但无法100%准确:
对比Default Cache Policy和Current Cache Policy是否不同,不同则是策略发生变动
1
|
root@
hostname
:~
# MegaCli -LDInfo -Lall -aALL
|
1
2
3
4
5
|
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)。