あるときふと気づいたのですが、あるサーバーからカチッ..(30秒くらい)..カチッ..(30秒くらい)..とHDDのヘッドが退避する音が定期的に聞こえていました。最初は故障かと思ったのですが、特に問題は見当たりません。
調べてみると省電力機能の1つのようで、省電力機能により一定時間アクセスがないとヘッドが退避するようです。ググった感じWDでは定番の症状のようですが、私が使っていたのはSeagateのST1000LM048でした。
どのぐらいの頻度でヘッドが退避されているのか、下記コマンドで確認してみました。これはSMARTのLoad_Cycle_Countをおおよそ9秒おきに取得します。
# while :; \ do \ echo -n "$(date +'%Y-%m-%d %H:%M:%S'): ";\ smartctl -a /dev/sda | grep Load_Cycle_Count | awk '{print $1" "$2" "$10}';\ sleep 9;\ done
2019-12-15 13:18:10: 193 Load_Cycle_Count 2706 2019-12-15 13:18:19: 193 Load_Cycle_Count 2706 2019-12-15 13:18:29: 193 Load_Cycle_Count 2707 2019-12-15 13:18:39: 193 Load_Cycle_Count 2708 2019-12-15 13:18:50: 193 Load_Cycle_Count 2709
取得する度に1つずつ増えています。
次に、sleepの間隔を8秒にしてみましょう。
# while :; \ do \ echo -n "$(date +'%Y-%m-%d %H:%M:%S'): ";\ smartctl -a /dev/sda | grep Load_Cycle_Count | awk '{print $1" "$2" "$10}';\ sleep 8;\ done
2019-12-15 13:21:03: 193 Load_Cycle_Count 2710 2019-12-15 13:21:12: 193 Load_Cycle_Count 2711 2019-12-15 13:21:20: 193 Load_Cycle_Count 2711 2019-12-15 13:21:29: 193 Load_Cycle_Count 2711 2019-12-15 13:21:37: 193 Load_Cycle_Count 2711 2019-12-15 13:21:45: 193 Load_Cycle_Count 2711
今度は増えなくなりました。WDの退避タイマーが8秒という情報があったのですが、Seagateも同じのようです。
ArchLinuxのwikiにWD向けの対策が紹介されていました。hdparmに-Jオプションというものがあり、これで省電力に移行するまでの時間を変えられそうです。
しかし、自分の環境はSeagateのためこのオプションは使えませんでした。(当たり前
とりあえずHDDが省電力ならないように常時アクセスを発生させるのが良いかなと考えて下記のスクリプトを作りました。
#!/bin/bash # チェックのインターバル INTERVAL=5 while : do # まずはインターバルの分待つ sleep $INTERVAL # デバイス一覧を作成する DEVLIST=$(echo $(lsblk -S -n -o NAME)) # 全デバイスに対してhdparmを実行する for DEV in $DEVLIST do hdparm /dev/${DEV} > /dev/null done done
$INTERVALおきにhdparmを取得するだけです。8秒だとヘッドが退避してしまうので5秒ぐらいが妥当な所でしょう。最初は定期的にlsするというのも考えたのですが、あまり短周期でやるとディスクのパフォーマンスに影響が出そうなのでhdparmにしました。
DEVLISTはデバイス名が変わったりしたら面倒なのでとりあえずSCSIデバイスを全部やるという雑なやり方にしました。
さて、問題なのはこれを実行してどれだけディスクのパフォーマンスが落ちるかです。 WindowsのCrystalDiskMarkみたいな事ができないかなと調べると、下記のサイトが出てきたので、これを参考にコマンド実行前、実行中で測定しました。
https://thr3a.hatenablog.com/entry/20180804/1533378243
実施前(純粋にベンチマークだけやる)
Seq-Read 124.445 Seq-Write 113.212 Rand-Read-512K 44.637 Rand-Write-512K 103.953 Rand-Read-4K 0.483 Rand-Write-4K 0.862 Rand-Read-4K-QD32 0.961 Rand-Write-4K-QD32 1.337
実行中(5秒おきにhdparmが実行される)
Seq-Read 118.832 Seq-Write 120.043 Rand-Read-512K 45.185 Rand-Write-512K 102.48 Rand-Read-4K 0.518 Rand-Write-4K 4.986 Rand-Read-4K-QD32 0.906 Rand-Write-4K-QD32 2.736
結果はほとんど変わらずでした。hdparmを5秒おきに実施する程度であればHDDにはほとんど負担をかけずに済みそうです。