Debian sid、ext4でフォーマットされたハードドライブを使用していて、Linux 3.1で実行しています
以前のLinuxバージョン(たぶん3.0以前)を覚えていますが、メモリ不足でスワップが有効になっていない場合、プログラムは通常クラッシュします。これは私の環境に最適です。重要な操作のないシンプルなWebブラウジングです。つまり、メモリを大量に消費する悪いWebサイトに偶然出くわした場合、端末が使用できなくなることなくクラッシュします。
しかし、私の現在のセットアップでは、コンピューターはバックグラウンドで激しいI/Oスループットでハングします。 iotopはkswapd0が原因であることを明らかにします。これは、スワッピングが原因であることを意味します。 swapon -s
を使用して有効になっているスワップを確認した後、swapoff -a
を使用してすべてのスワップを無効にし、swapon -s
を使用してすべてのスワップが無効になっていることを確認しました。
次に、メモリ使用量を最大化してみました。悲しいかな、私が期待した行動は起こりませんでした。代わりに、kswapd0はRAMを何度もスワップアウトしようとしますが、スワップスペースがないため失敗します。決してあきらめないため、コンピュータは永遠のI/Oヘビーフリーズにロックされています。私のディスクの健康。
swapoff -a
をしようとして何か間違ったことをしていますか?動作が以前の動作と異なるのはなぜですか(おそらく3.0倍前)。
スワップを無効にしても、期待どおりに動作しません。引き続きI/Oスループットは激しくなりますが、ダーティページではなくクリーンページになります。
スワップがない場合、システムはクリーンな(変更されていない)ページのキャッシュをほぼゼロに圧縮します。これは、物理メモリから削除できる唯一のページだからです。ダーティ(変更済み)ページをスワップに書き込むことによってメモリから削除できるのはスワップだけではなく、ダーティページを削除する方法はありません。
物理メモリが不足すると、前のプロセスのコードページが削除されるため、各プロセスはディスクからコードページをロードする必要があります。その結果、スワップサブシステムによる激しいスラッシングと過度の作業が発生します。
これは非常に重要な原則の特別なケースです。適切に設計されたシステムの場合、選択肢を減らすことでシステムをより良く実行することはできません。 Linuxは適切に設計されたシステムです。スワップを削除すると選択肢が減るだけなので、動作が悪くなるのも当然です。
スワップをオフにするよりも良い解決策は、メモリが不足するとランダムプロセスが強制終了されることですが、ネットワークからデータを取得するプロセスにプロセスごとのデータセグメント制限を設定することです。このようにして、システム全体が使用できなくなるのではなく、暴走したブラウザが限界に達して死にます。例、シェルから
(ulimit -d 400000; firefox) &
-dの後の数値はキロバイトです。システムでこれを試して、閲覧習慣に最適な値を選択する必要があります。括弧により、サブシェルが作成されます。 ulimitコマンドは、そのシェルとその子にのみ影響を与え、その影響を親シェルから分離します。
スワップが使用されていないことを確認するには、起動時にスワップが追加されないようにした方がよいでしょう。これは、システムに応じて、swap
ブートサービスを無効にするか、_/etc/fstab
_のスワップエントリをコメント化するだけで実行できます。
ハングアップに関する限り、_/etc/init.d/swap
_のstop()
関数が手掛かりを与える可能性があります。
_stop()
{
ebegin "Deactivating swap devices"
# Try to unmount all tmpfs filesystems not in use, else a deadlock may
# occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
cd "$RC_SVCDIR"
umount -a -t tmpfs 2>/dev/null
case "$RC_UNAME" in
NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
*) swapoff -a >/dev/null;;
esac
eend 0
}
_
deadlockに関する部分に注意してください。自分で_umount -a -t tmpfs
_を試すことができますbeforeスワップをオフにします。
編集:
おそらく、sysctl
の設定を変更することで目標を達成することもできます( この質問 を参照)。
各ブート後に/etc/fstab
を実行するよりも、swapoff -a
のスワップパーティションエントリをコメントアウトすることをお勧めします。
ハードウェアのkswapd0で同じ問題があります。
vm.swappiness
システムパラメータのチューニングは役に立ちません。
sysctl -w vm.swappiness=0
私はググってたくさんの投稿、メーリングリストを読んだ、そして今これはカーネルのバグだと思う。
アクティブなスワップパーティションがなく、空きメモリがしきい値(私の場合は約300MB)未満になると、kswapd0の狂気によりシステムが応答しなくなります。
おそらくそれは特別な構成と条件で再現されています。
誰かにとっては、kswapd0
を無効にしてカスタムカーネルを構築することにより、他の人のために再パーティション化するシステムの再インストールによって解決されます。
コンピュータはバックグラウンドで激しいI/Oスループットでハングします。 iotopがkswapd0が原因であることが判明
これを回避する方法を(これまでのところ)見つけました。テストしてシステムでどのように動作するかを確認する場合は、 この質問 内の カーネルパッチ を参照してください。基本的に、メモリの負荷がかかっている場合、(少なくとも)Active(file)
ページは削除されません。そのため、ディスクスラッシング(一定の読み取り)はほとんどなくなり、OOMキラーは1秒以内にトリガーできます。 OSを恒久的に(または少なくとも数分間)凍結する方法。実際のプログラマー(私はそうではありません)がパッチを改善して実際のソリューションにしてくれることを願っています。これで、彼らが these の状況で機能していることがわかりました。
私のシステム(debian sid 2016-11-15)では、これを行いました:
今すぐスワップを無効にします:
swapoff -a
/ etc/fstabのswapパーティションの行をコメント化します
#### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none swap sw 0 0
systemdでスワップのマウントを無効にします。
systemctl --type swap
systemctl stop dev-sda6.swap
systemctl mask dev-sda6.swap
それで十分でしょう。 /etc/initramfs-tools/conf.d/resume
ファイルにスワップの参照があります。これの目的は何なのかわかりません。たぶん、次の再起動時にこのファイルが問題になるかもしれません(私はまだ再起動を試みていません。私の稼働時間は貴重です;))。