低温環境でのHDDの動作
あるデータセンターに導入したサーバーの初期セットアップ時に今までに経験したことのないHDDトラブルに見舞われました。今回はそのトラブルの原因究明と解決に至るまでのお話です。
HDDの故障?
7月、新データセンターでの初期セットアップ時にHDDの書き込み速度がやたら遅いディスクがあるという話が出てきました。 話を聞くと1台だけでなく複数台に発生しているとの事です。 その時の測定値は次のような感じでした。
実際の測定値
# dd if=/dev/zero of=/mnt/p0/test bs=1M count=2048 (RAIDカードの0番ポートにあるディスク) 2048+0 records in 2048+0 records out 2147483648 bytes (2.1 GB) copied, 43.8163 seconds, 49.0 MB/s # dd if=/dev/zero of=/mnt/p1/test bs=1M count=2048 (RAIDカードの1番ポートにあるディスク) 2048+0 records in 2048+0 records out 2147483648 bytes (2.1 GB) copied, 514.409 seconds, 4.2 MB/s # dd if=/dev/zero of=/mnt/p2/test bs=1M count=2048 (RAIDカードの2番ポートにあるディスク) 2048+0 records in 2048+0 records out 2147483648 bytes (2.1 GB) copied, 515.813 seconds, 4.2 MB/s # dd if=/dev/zero of=/mnt/p3/test bs=1M count=2048 (RAIDカードの3番ポートにあるディスク) 2048+0 records in 2048+0 records out 2147483648 bytes (2.1 GB) copied, 43.2759 seconds, 49.6 MB/s
今回のサーバは4台のHDDをもっておりそれぞれRAIDカードにつながっています。 そして、調査を行った結果、これらのサーバのうち数台で上記測定値のようにHDD4台のうち2台ないしは1台の書き込み速度が極端に遅いことがわかりました。 何度測定を行ってみても書き込みが遅いことは変わらなかったため、最終的にHDDの故障である可能性が高いと判断し、購入元(いつもお世話になっている協力会社さん)に調査をお願いしました。
データ保護機能 RAW(Read After Write)
1ヵ月後、協力会社さんから衝撃的な連絡が入ります。 なんと「データセンターの温度が低すぎる」というのです。 温度が高すぎるとHDDの故障しやすいなどはよく聞く話ですが、逆に温度が低すぎてHDDに影響がでるというのは初耳です。
協力会社さんの話によると、今回導入した Seagate製の Barracuda ES(SATA高耐久)シリーズには、RAW(Read After Write)という機能があり、その機能が働いて遅くなっているとの事でした。 このRAWというのは、ある温度を閾値として(58℃以上 または 18℃以下)有効になる機能です。 この機能が有効になると、データを書き込む際はブロックにデータを書き込みした直後にそのブロックを読み出し正確に書き込みができているかチェックするようになります。 この読み込みで、もしエラーが確認された場合は再度同じ手順で書き込みを行います。
つまり、低温時でのデータ書き込みには、通常の温度では発生しない「読み込み」と「書き込み内容の確認」処理が追加された結果、本来の1/10以下のパフォーマンスしか発揮できなくなったのです。 しかも、メーカー側からの回答によるとこの機能はOFFにすることができないとの事でした。
では、なぜこの温度(18度)を閾値にしてこのような機能を実装しているのでしょうか。
これはおそらく、HDDの記録媒体として利用されている磁性体の特性を考慮していると考えられます。 一般的なHDDに使われている磁性体は低温で保磁力が高く(磁力が抜けにくく)なります。 その結果、読み込みは問題ないが、書き込みをしてもそれが記録できていない状態が発生する可能性が出てくるため、Seagate 社はこのような処理をする事でデータの正確性を確保しようとしているのでしょう。 そして、おそらくは利用している磁性体で確実に書き込みできる最低温度が18度なのでしょう。
ちなみに、過酷な条件下で使われることが前提となるカーナビのHDDの場合は、低温でも保持力が高くならない磁性体を利用しており、氷点下でも利用ができるようになっているようです(デメリットとして記録できる容量が少なくなっています)。
事の顛末
では、実際の温度はどれくらいなのか調べてみました。
HDDの温度
# for i in `seq 0 3` ; do smartctl -d 3ware,$i -a /dev/twa0|grep Temp ; done 194 Temperature_Celsius 0x0022 020 040 000 Old_age Always - 20 (Lifetime Min/Max 0/16) 194 Temperature_Celsius 0x0022 017 040 000 Old_age Always - 17 (Lifetime Min/Max 0/15) 194 Temperature_Celsius 0x0022 017 040 000 Old_age Always - 17 (Lifetime Min/Max 0/15) 194 Temperature_Celsius 0x0022 018 040 000 Old_age Always - 18 (Lifetime Min/Max 0/15)
見事に、閾値の前後の温度となっています。 となると、この状態を改善するにはサーバの温度を上げるしかありません。
サーバの温度を下げる対応を行うことはあっても、上げるための対応などなかなか行うことはありませんのでかなり苦労しました。 ただ単純にサーバのFANを止めたりして冷却能力を下げると、CPUの温度が上昇した時に問題となる可能性があります。 そこで、FANの回転数を温度によって制御するモードに変更を行い高負荷時以外は回転数を落とすよう変更したり、ラック全体の冷却性能を落とすため、冷気の入ってくるラック下部に棚板を設置し空気の流れをさえぎる対応を行いました。
こうした対応の結果、各HDDの温度は閾値より高いものになり、すべてのHDDで期待したパフォーマンスを発揮できる状態となりました。
まとめ
今回、われわれにとって問題となったRAWという機能ですが、調べる限りSeagate社のみの機能のようで、他のHDDメーカーは実装していないようです。 これは、利用している磁性体の違いなのか、それともメーカーとしてのポリシーの違いなのかは残念ながらわかりません。 また、18度付近でのエラー率などの情報もありません。 今後、このような情報を各HDDメーカーが公開して下さる事を期待します。