web-dev-qa-db-ja.com

毎秒、新しいext4パーティションに無限に書き込みが発生します。原因と解決策は?

Ubuntu 12.04を実行するラップトップに外部500GB HDDを接続しました。ディスク全体にまたがる1つのext4パーティションで外部ドライブをフォーマットしました。

私の問題は、書き込みが発生するため、ディスクが毎秒ノイズを発生させることです。積極的にディスクにファイルを書き込んだり、ディスクを使用したりすることはありません。マウントされたばかりで、アイドル状態になっているはずです。

Iotopを使用すると、ディスクを接続した状態で、jbd2プロセスがディスクに書き込むことがわかります。ディスクが接続されていない場合、このjbd2プロセスは何もしません。ドライブの接続を解除しても、ノイズはすぐに停止しますが、接続したままにしておきます。

iotop:

Total DISK READ:       0.00 B/s | Total DISK WRITE:    1838.15 K/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                 
 3727 be/3 root        0.00 B/s    0.00 B/s  0.00 %  0.15 % [jbd2/sdb1-8]
    1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init
    2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
    3 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
...

まず第一に、ノイズは私を夢中にさせます。私は静かな環境で働いていますが、これは非常に低いノイズであるため、どういうわけか邪魔になります。

第二に、ディスクへのこれらの連続書き込みは、ディスクの寿命を低下させる可能性があると思います。これは、ノイズが存在しないSSDドライブにとって特に重要ですが、同じ動作が観察される可能性があります。さらに、ユーザープロセスがディスクにアクセスしておらず、オペレーティングシステムがその操作のために外部HDDにアクセスする必要がないので、ディスクへの書き込みは必要ないはずだと思います。

これらの書き込みアクセスの原因とそれらの停止方法は?

2
Daniel S.

から man mke2fsページと このリンク ext4ファイルシステムのフォーマットのデフォルトは非常にlazyであり、多くの執筆作業を終了するようですafterドライブは初めてマウントされ、作業が完了するまで毎回マウントされます。最も厄介なことに、完了するまで数秒ごとに非常にゆっくりとドライブに書き込みます。

これは、非常に大きなブロック/ページサイズを持つフラッシュドライブ(カード/ USBドライブ)にとって特に悪い可能性があるため、ほんの数バイトを書き込むと、実際には256k、512k、または1 M​​B以上に書き込みます。また、一部のフラッシュドライブでは、書き込みサイクルが1000回(または5000回または10,000回、場合によっては100,000回)になる場合があります。ハードドライブよりもはるかに低く、ハードドライブでさえ、すべての書き込みを一度に実行することで、実際にアイドル状態になったときにアイドル状態にできるため、おそらくさらにメリットがあります。また、ドライブへの書き込みがどのくらい続くかはわかりませんが、数分または数日かかると言う人もいます。これは、フラッシュドライブを「フォーマット」する最悪の方法のようです。

Manページからの抜粋:

-E extended-options
      Set extended options for the filesystem.   Extended  options  are
      comma  separated, and may take an argument using the equals ('=')
      sign... The following extended options are supported:
...
 lazy_itable_init[= <0 to disable, 1 to enable>]
        If  enabled  and  the uninit_bg feature is enabled, the inode
        table will not be fully initialized by mke2fs.   This  speeds
        up  filesystem initialization noticeably, but it requires the
        kernel to finish initializing the  filesystem  in  the  back‐
        ground  when  the filesystem is first mounted.  If the option
        value is omitted, it defaults to 1 to enable lazy inode table
        zeroing.

 lazy_journal_init[= <0 to disable, 1 to enable>]
        If enabled, the journal inode will not be fully zeroed out by
        mke2fs.  This speeds up filesystem initialization noticeably,
        but  carries some small risk if the system crashes before the
        journal has been  overwritten  entirely  one  time.   If  the
        option  value  is  omitted,  it  defaults to 1 to enable lazy
        journal inode zeroing.

したがって、ファイルシステムを最初にフォーマット(または再フォーマット)できる場合、これは遅延の遅いフォーマットを排除し、すべてを一度に完了する必要があります。

mkfs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdxN
1
Xen2050

簡単な解決策があります。ディスクを数時間PCに接続したままにしておくと、ノイズが自動的に停止します。所要時間の概算は、パーティションサイズ1TBあたり1.5時間です。

これは、ext4にフォーマットしてもファイルシステムが完全に初期化されないためです。初期化作業の多くはjbd2に委任されます。jbd2は ファイルシステムのジャーナル を維持する役割を果たします。
フォーマット時には、ディスクの使用に必要な情報のみが書き込まれます。すでにディスクを使用できますが、jbd2は追加情報を追加します。このように設計されているため、書式設定は迅速です。フォーマット後に観察している書き込み操作はディスクのパフォーマンスに影響を与えません。つまり、ファイルをディスクにコピーするとき、jbd2はジャーナルを書き込むため、コピープロセスは遅くなりません。

jbd2は、遅延した間隔で作業を行うように設計されています。ほとんどのハードディスクには省電力メカニズムが組み込まれており、ディスクをオフにしたり、 heads をパークしたりできるため、ハードディスクがアイドル状態であることを検出したり、ヘッド、およびその直後にjbd2は再びディスクにアクセスし、ヘッドを再び移動させます。これはあなたが聞いている低ノイズです。

ハードディスクの省電力メカニズムを制御できる場合(一部のHDDはこれをサポートしますが、一部はサポートしません)、次のコマンドを使用して省電力メカニズムを無効にすることができます。

Sudo hdparm -B 255 /dev/sdXY

sdXYをハードディスクパーティションへのパスで置き換える必要があります。コマンドが失敗した場合、お使いのHDDは省電力メカニズムの制御をサポートしていないため、消音することはできません。次に、この回答の冒頭で説明したように待つ必要があります。

2
Daniel S.