ディスクがマウントされていなくても(USBエンクロージャに)目を覚ます

ディスクがマウントされていなくても(USBエンクロージャに)目を覚ます

設定

私のNASサーバー(ubuntuサーバー14.04)に接続されている4つのドライブを含むUSBエンクロージャー(Buffalo DriveStation Quad)があります。シャーシはJBODモードで構成されているため、Linux上のすべてのディスクが表示されます。

2つのディスク(sdbとsdc)は、ソフトウェアraid /dev/md0(raid1)を使用して構成されます。 ext4ファイルシステムを使用して/dev/md0単一のパーティション()としてマウントされ、ロギングは必要ありません。/mnt/part1

他の2つのディスク(sddとsde)はLVMを使用してボリュームグループに設定され、ここで2つの論理パーティションをマウントしました。そのうちの1つはボリュームグループ全体の容量の90%()/mnt/part2、もう1つは10%(/mnt/part3)です。どちらもext4で、ロギングはありません。

APMの問題

私の問題は、ハードドライブヘッドが数分ごとに非常に頻繁に固定されることがわかったので、デフォルトのAPMモードで始まりました。トピックについて調査した後、最終的にhdparm -B198 /dev/sd[bcde]

寝ましたか?

現在の状況に満足していますが、活動がなければ眠りにつくドライブもあればいいです。具体的には、sdbとsdc(/mnt/part1)は実際には95%の時間の間何の活動も実行しません。いくら努力してもドライブが1~2分以上省電力モードに切り替わらないことが問題のようです。

すべてのパーティションをアンマウントしてコマンドを実行すると、hdparm -y /dev/sd[bcde]ドライブはスリープ状態になりますが、数分間しか使用できません。それから彼らは1つか2つずつ目覚めます。 block_dump()を有効にして問題をデバッグしようとしましたが、echo 1 > /proc/sys/vm/block_dumpディスクへのアクセスが表示されませんでした。

hdparm -B255 /dev/sd[bcde]また、APMを無効にしてからスリープコマンドを試してみましたが、まだ同じです。ドライブは数分後も目覚め続けます。

私はデーモンモードで実行していませんmdadm(1日に1回だけチェックして)、ドライブを調べる他の何もしてはいけません。それでは、次に何を試してみるかについてのアイデアがありますか? Buffalo 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。役に立ちません。ところで、マシンはLenovo L520ノートブックです。誰かが関連性があると思う場合に備えて。

ベストアンサー1

少し過剰かもしれませんが、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 ~]#

おすすめ記事