セットアップ
NASサーバー(ubuntuサーバー14.04)に接続された4台のドライブを含むUSBエンクロージャー(Buffalo DriveStation Quad)があります。エンクロージャーはJBODモードに構成されているため、Linuxですべてのディスクが表示されます。
2つのディスク(sdbとsdc)は、ソフトウェアRAIDで/dev/md0
(raid1)として構成されています。また、/dev/md0
は、ジャーナリングなしでext4ファイルシステムを使用して単一パーティション(/mnt/part1
)としてマウントされます。
他の2つのディスク(sddとsde)は、LVMを1つのボリュームグループとしてセットアップし、そこから2つの論理パーティションをマウントしました。 1つはボリュームグループ全体の容量の90%(/mnt/part2
)で、もう1つは10%(/mnt/part3
)です。どちらもジャーナリングなしのext4です。
APMの問題
私の問題は、ハードドライブのヘッドが数分ごとに非常に積極的に駐車していることに気付いたため、デフォルトのAPMモードから始まりました。トピックを少し調べた後、私はhdparm -B198 /dev/sd[bcde]
を使用することになりました。これにより、ある程度の省電力が可能になるようですが、実際にはヘッドパーキングを行う必要はありません。
睡眠はありますか?
現在の状況にはある程度満足していますが、アクティビティがない場合でもドライブをスリープ状態にしてほしいです。特に、95%の時間実際にアクティビティを取得しないsdbとsdc(/mnt/part1
)。私が何を試しても、問題はドライブが1、2分以上スリープしないことだと思われます。
すべてのパーティションをアンマウントし、hdparm -y /dev/sd[bcde]
を発行すると、ドライブはスリープモードになりますが、数分間だけです。その後、彼らはすべて一人ずつ目を覚ますでしょう。 block_dump(echo 1 > /proc/sys/vm/block_dump
)を有効にして問題をデバッグしようとしましたが、ディスクへのアクセスが表示されません。
また、hdparm -B255 /dev/sd[bcde]
を使用してAPMを無効にし、その後スリープするように命令しようとしましたが、同じことです。それでも、ドライブは数分後にウェイクアップします。
デーモンモードでmdadm
を実行していません(1日1回のチェックのみ)。また、ドライブをプローブするものは他にありません。では、次に何を試すべきかについてのアイデアはありますか?バッファローのUSBエンクロージャーはただのくだらないものですか(そしてこれはそれ自体で行います)?
更新#1
hdparm -y /dev/sd[bc]
を発行してから、ディスクがウェイクアップするまでにどのくらいの時間がかかりましたか。次のタイムスタンプはパターンを示しています。
00:00 hdparm -y /dev/sd[bc]
00:40 disks start to wake up
00:59 disks fully awake
01:00 hdparm -y /dev/sd[bc]
03:40 disks start to wake up
03:59 disks fully awake
04:00 hdparm -y /dev/sd[bc]
06:40 disks start to wake up
06:59 disks fully awake
つまり何かが3分ごとにディスクをチェック/ウェイクアップしているようです。スタンバイモードに移行する最初のコマンドは、たまたまチェックポイントから40秒でした。
アップデート#2
acpi=off apm=off
でマシンを再起動しました。どちらも助けにはならなかった。ところで、マシンはレノボL520ラップトップです。誰かがそれを適切だと思った場合に備えて。
少しやり過ぎかもしれませんが、SystemTap
は、そのディスクでI/Oを実行しているプロセスを特定するのに役立ちます。
SystemTapの準備
[root@localhost ~]# stap-prep
snip
トレーススクリプトのインストール
[root@localhost ~]# cat >/tmp/traceio2.stp
#! /usr/bin/env stap
global device_of_interest
probe begin {
/* The following is not the most efficient way to do this.
One could directly put the result of usrdev2kerndev()
into device_of_interest. However, want to test out
the other device functions */
dev = usrdev2kerndev($1)
device_of_interest = MKDEV(MAJOR(dev), MINOR(dev))
}
probe vfs.write, vfs.read
{
if (dev == device_of_interest)
printf ("%s(%d) %s 0x%x\n",
execname(), pid(), ppfunc(), dev)
}
監視するデバイスIDを見つけます。この場合は/ dev/sda5を監視します
[root@localhost ~]# df -k /
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda5 18141508 16293424 903496 95% /
[root@localhost ~]# ls -l /dev/sda5
brw-rw----. 1 root disk 8, 5 Jul 1 01:21 /dev/sda5
[root@localhost ~]#
16進数のメジャー+マイナー番号(8,5)を使用して監視します。原因を見つけます。喜んでください
[root@localhost ~]# /tmp/traceio2.stp 0x805
accounts-daemon(434) vfs_read 0x800005
accounts-daemon(434) vfs_read 0x800005
accounts-daemon(434) vfs_read 0x800005
lightdm(503) vfs_write 0x800005
bash(3036) vfs_read 0x800005
bash(3036) vfs_read 0x800005
^C
[root@localhost ~]#