我が家のNASサーバーはFreeBSDの入ったHP microserverである。
HP microserverにはHDDを4つ入れることができる。
たいへん便利なのだが、HDDが4つとも24時間動きっぱなしというのは精神衛生上、よろしくない。
実は、HDD4つのうちメインで使っているのはOSの入っているものと、Samba共有しているものの2つだけで、残りの2つはバックアップ用である。
少なくとも、残りの2本はバックアップを取得するときだけ動いてくれればよいので、それ以外の間は、HDD内円盤の回転を止めておきたい(スピンダウン)。
しかしSamba共有しているもの、バックアップ用のHDD(要するにOSの入っているHDD)以外はすべてzfsのzpoolを構成しているものである。
気軽にスピンダウンしてしまってよいものだろうか。
というのが調査を始めたきっかけである。
ああ、それと、頻繁に止めたり動かしたりすることがHDDに悪い、というのは重々承知の上。
結論(camcontrol standbyしろ)
結論から言うと、camcontrolでディスクを止めろ。
ディスク停止には、“standby"で。“idle"はやめておけ。
ATAデバイスのモード
ATAデバイスには4つのPower Modeがあり、条件によりそれぞれを行き来する。
- Active
- Idle
- Standby
- Sleep
Activeモードは、通常のデータのやり取りができる状態のこと。
それ以外は、Idle > Standby > Sleep の順に消費電力が下がり、反応速度も遅くなる。
詳細は以下書類(PDF注意)の4.18.3 Power modesを参照されたし。
http://www.t13.org/Documents/UploadedDocuments/docs2007/e07163r2-Comments_on_ATA8-ACS_revision_4a.pdf
これを踏まえて、任意のタイミング、あるいは、一定時間アクセスがないタイミングでIdle/Standby/Sleepに遷移させられれば目的が達成できる。
FreeBSDにおいて、Power modeの遷移にはcamcontrolコマンドを使う。
しかしその前に、zfs/zpoolで使えるPower Modeを調べねばならない。
zfsにはStandby
FreeBSD Forumにあるcamcontrol standby weirdnessというスレッドを見ると、以下のような記述がある。要するにStandbyを使えと。Idleだとzfsは当該ディスクをlost/defect/detachedと判断し、zpoolはdegradedになるか、unavailableになるという。
First of all: ZFS is fine with disks that go into STANDBY (accessing a zpool with disks in STANDBY will wake them up and ZFS will wait for it). ZFS cannot handle disks that are in IDLE mode (it considers the disks lost/defect/detached and the zpool will go degraded or even unavailable).
https://forums.freebsd.org/threads/camcontrol-standby-weirdness.59296/#post-340121
自分で試す気にはならないので、そのまま受け取る。
camcontrolによるstabdby操作
再びFreeBSD Forum。[AHCI] Spinning down ada(4) disksというスレッドの以下のポストを参照
https://forums.freebsd.org/threads/ahci-spinning-down-ada-4-disks.8841/page-2#post-98640
camcontrol standby adaXとすればよい。
またcamcontrol standby adaX -T sssとすれば、ただちにstandbyモードに移行し、その後もsss秒、アクセスがなければstandbyモードに移行することができる。
以下なら/dev/ada3をすぐにstandbyモードに移行させるとともに、20分の間アクセスがなければやはりstandbyモードに遷移するようタイマー設定している。今すぐはstandbyモードにしなくてもいいけど、タイマーだけ設定したい、という方法はないみたいだ。
# camcontrol standby ada3 -T 12000
しかし上記のコマンドを実行したとしても、応答はない。なしのつぶてである。
standbyモードに移ったのか。かくなる上はHDDの回転数はいかほどか、耳を澄ますほかはない。
そんなご無体な、とgoogle先生に訴えたところ、FreeNASのフォーラムに以下のポストを発見。
Spinning Down your Drives and Checking Power States. (New Script)
上記にあるスクリプトを使えば、power modeを知ることができる。
本記事の末尾に転載しておく。get_drive_status.sh
として保存しておいた。
実行してみると;
$ sudo drivestatus.sh
ada0: FF
ada0: Running
ada1: FF
ada1: Running
ada2: FF
ada2: Running
ada3: FF
ada3: Running
camcontrolでstandbyにしておいて再実行。
$ sudo drivestatus.sh
ada0: FF
ada0: Running
ada1: 00
ada1: Standby
ada2: 00
ada2: Standby
ada3: 00
ada3: Standby
/dev/ada0はOSのあるHDDだからActiveですな。
運用方法(なにかが変)
よしこれで解決。
と思ったのだが、タイマー満了してもpower modeがstandbyに移らないのである。
その割に、そのディスクのディレクトリにアクセスすると、ファイル一覧の表示に待たされたりするのである。
先に引用した彼も同じことに悩んでいる。
But, then, when the disk is idle for > 1800sec (monitor with ‘zpool iostat 60’), it will not spin down. Huh?
https://forums.freebsd.org/threads/camcontrol-standby-weirdness.59296/#post-339820
この彼は、zpool iostat でディスクへの読み書きをモニターできるので、何分かアクセスがなければidleモードに移すスクリプトを書いた、と言っている。
常駐スクリプトを運用するのが面倒なので、cronジョブでstandbyさせるようにした。
結果
ワットチェッカーなんてものは持っていないので、単純に温度で確認した。
以下がそのグラフ。
ある日を境に、(OSのある/dev/ada0を除いて)温度が劇的に下がっていて、現時点ではまあ満足。
power mode確認スクリプト
#!/bin/bash
#
# Created by: Motorahead
# Date: 02/19/2016
# Checks For Running Status of Connected ADA Devices
# Look for Connected Devices
DEVICELIST=($( camcontrol devlist | grep -o 'ada[0-9]' ))
# Checks Drive Status, but only outputs relative field $10
STATUS(){
camcontrol cmd ${LIST} -a "E5 00 00 00 00 00 00 00 00 00 00 00" -r - | awk '{print $10}'
}
# Loop through each device found in ${DEVICELIST}
for LIST in ${DEVICELIST[@]}; do
echo -n "${LIST}: "
STATUS
# If the Output is 00, then the drive is in Standby. If it's FF, then it's active.
if [[ "$(STATUS)" == "FF" ]]; then
echo "${LIST}: Running"
elif [[ "$(STATUS)" -eq "00" ]]; then
echo "${LIST}: Standby"
else
echo "${LIST} is in a unrecognized state."
fi
done