HDDのヘッド退避問題


あるときふと気づいたのですが、あるサーバーからカチッ..(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にはほとんど負担をかけずに済みそうです。