スワップを完全に無効にする方法は?


30

Linux 3.1で実行しているext4でフォーマットされたハードドライブのDebian sidを使用しています

以前のLinuxバージョン(おそらく3.0より前)で、メモリが不足し、スワップが有効になっていない場合、プログラムは通常クラッシュします。これは私の環境に最適です。重要な操作のないシンプルなWebブラウジングです。つまり、メモリを大量に消費する悪いWebサイトに偶然出くわすと、端末が使用できなくなることなくクラッシュします。

しかし、私の現在のセットアップでは、コンピューターはバックグラウンドで激しいI / Oスループットでハングします。iotopは、kswapd0が犯人であることを明らかにします。これは、スワップが原因であることを意味します。使用後にswapon -s有効にされた任意のスワップを決定するために、私が使用するswapoff -aすべてのスワップを無効にするとswapon -s、すべてのスワップが無効になったことを確認するために再び。

次に、メモリ使用量を最大化してみました。悲しいかな、私が期待した動作は起こりませんでした。代わりに、kswapd0は何度も何度もRAMをスワップアウトしようとしますが、スワップスペースがないため失敗します。決してあきらめないので、コンピューターは永遠のI / Oの激しい凍結にロックされ、ディスクの状態が悪くなります。

私はしようとして何か間違っていswapoff -aますか?振る舞いが以前のものと異なるのはなぜですか(おそらく3.0以前)?


それは本当に意味がありません。スワップに何かがあった場合、swapoff -a それ自体を実行すると、大量のI / Oが生成されます(実際のRAMが十分にない場合、プロセスが強制終了される可能性があります)。swapoff -aI / O「ストーム」を引き起こしたのはそれではないのですか?
マット

1
fstabスワップに関する行をコメントするだけで十分だと思います。動作が同じ場合に試してください。
enzotib

@Mat swapoff -aはスワップを永続的に無効にする必要があります。つまり、次回の再起動後も無効のままにしておく必要があります。これを確認しました。それでも、次回の再起動後のセッション中にI / Oの「ストーム」が発生します。記録でswapoff -aは、その時点でスワップが0だったため、I / Oの「ストーム」は私が行った瞬間には発生しませんでした。
syockit

9
@syockit:永続的でswapoff -aはありません
マット

1
データベースのロードは14時間で約15%に達しました。スワップをオフにし、次の試行で4時間で40%になりました。確かに、サーバーの電力は不足しており、RAMは低下していますが、スワップを有効にしないと、OpenSuSEはこの1つのプロセスではるかに高速に動作します。OSの「より良い」と私の意見は、単純なmysql dbロードの間に劇的に異なります。/ etc / fstabのスワップドライブをコメントアウトして再起動しました。
TheSatinKnight

回答:


15

スワップを無効にしても、望みどおりにはなりません。それでも激しいI / Oスループットが得られますが、ダーティなページではなくクリーンなページになります。

スワップを使用しない場合、システムはクリーンな(変更されていない)ページのキャッシュをほぼゼロに圧縮します。これは、それらが物理メモリから削除できる唯一のページだからです。スワップなしでダーティ(変更された)ページをメモリから追い出すことができます。スワップなしで、ダーティページを追い出す方法はありません。

物理メモリが不足すると、各プロセスは以前のプロセスコードページを排除するため、ディスクからコードページをロードする必要があります。結果は、スワップサブシステムによって行われる激しいスラッシングと過剰な作業になります。

これは非常に重要な原則の特別な場合です。適切に設計されたシステムの場合、選択肢を減らして実行を改善することはできません。Linuxは適切に設計されたシステムです。スワップを削除すると選択肢が少なくなるため、動作が悪くなることは驚くことではありません。


1
これは、すべてのメモリが不足している場合にのみ当てはまります。暴走プロセスは通常、はるかに多くを割り当てようとしているため、より多くの割り当てに対応しようとしてシステムを死までスワップし続けるのではなく、早期に殺され、そのメモリを解放します。したがって、スワップを無効にすると役立つ場合があります暴走したプロセスからラムの使用量を最大にするだけです。
psusi

1
すべてのメモリが不足すると、ほとんど常に割り当てられます。Linuxは特にこの方法で調整されています。やるcat /proc/meminfo負荷の数時間後に任意の一般的なLinuxマシン上に。
デビッドシュワルツ

2
@syockitページングを無効にすると、プログラムを実行できなくなります。ページングは​​、メモリにマップされるときにファイルが読み込まれるメカニズムです。
デビッドシュワルツ

2
@psusi:スワップがある場合、クリーンページは最小限に削減されません。代わりに、最近使用されていないダーティな匿名ページを交換します。もちろん、どちらにしても、ワーキングセットが物理メモリを超えると、最終的には激しいスラッシングが発生します。重要なのは、スワップの有無にかかわらず、実際にメモリが不足する前に多くの暴力的なスラッシングが発生することです。違いは、スワップでは、激しいスラッシングがスワップ(ダーティページ、書き込み、読み取り)になることです。スワップを使用しない場合、激しいスラッシングはコードフォールト(クリーンページ、読み取り専用)になります。
デビッドシュワルツ

2
@psusi:懸念事項がメモリ消費を急速に増大させる暴走プロセスである場合、あなたは正しいです。しかし、それはOPが言っていることではありません。これは過剰なメモリを消費しますが、無制限または大量のメモリを消費するプロセスではありません。大きなスイートスポット(キャッシュが圧縮されている場所)を介して成長するにつれて、システムがスラッシングするにつれて、ゆっくりと成長します。
デビッドシュワルツ

13

スワップをオフにするよりも良い解決策は、メモリが不足するとランダムプロセスが強制終了されるようにすることです。これは、ネットワークからデータを引き出すプロセスにプロセスごとのデータセグメント制限を設定することです。これにより、システム全体が使用できなくなるのではなく、暴走したブラウザが制限に達して死にます。例、シェルから

(ulimit -d 400000; firefox) &

-dの後の数値はキロバイト単位です。システムでこれを試して、ブラウジングの習慣に最適な値を選択する必要があります。括弧はサブシェルを作成します。ulimitコマンドは、そのシェルとその子のみに影響し、その効果を親シェルから分離します。


たとえば、chromium小さなメモリチャンクを使用する多数のプロセスがあるクロムでは、これは機能しますか?
jberryman

@jberrymanいいえ、メモリの制限はユーザーごとではなくプロセスごとです。
カイルジョーンズ

メモリ制限に達したときに、指定されたシグナル(SIGHUPなど)を送信する方法はありますか?
ジェレミア

1
@Geremiaいいえ。brkおよびsbrkシステムコールは動作を停止します。これにより、ほとんどのものが丸まって死にます。
カイルジョーンズ

手動チューニングに行きたい場合はメモリのcgroupを使用すると、全体のプロセスグループの制限を設定することができますので、私が代わりにulimitののメモリのcgroupを使用することをお勧めし停止にプロセスを割り当てるメモリを構成することができますし、ユーザーモードポリシープロセスは何に決めることができます(たとえば、いくつかのシグナルを送信し、強制終了するプロセスを選択し、その場でメモリ制限を上げます)。詳細については、kernel.org / doc / Documentation / cgroup- v1 / memory.txtおよびkernel.org/doc/Documentation/cgroup-v2.txtを参照してください。
ミッコランタライネン

4

スワップが使用されていないことを確認するには、起動時にスワップが追加されないようにすることをお勧めします。これは、システムに応じて、swapブートサービスを無効にするか、のスワップエントリをコメントアウトするだけで実行でき/etc/fstabます。

ハングアップに関する限り、のstop()関数は/etc/init.d/swap手がかりを与える可能性があります。

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
}

デッドロックに関する部分に注目してください。スワップをオフにするumount -a -t tmpfs自分でやってみることができます。


編集:

おそらく、sysctl設定を変更して目標を達成することもできます(この質問を参照)。


私はを持っていないswapinit.d、持っていませんが、緊急ログ書き込み用のマウントfstabは持っ/etc/init.d/mountoverflowtmpていtmpfsます。スワップデーモンも使用していtmpfsますか?
syockit

他の場所で有効にgrep -RF swap /etc/することもできます。見つけたい場合は実行してください。しかし、サービスを無効にするには、service(IIRC;私は自分でDebianを使用しません)のようなコマンドを使用します。
rozcietrzewiacz

1
スワップ自体は、メモリ内(RAM)ファイルシステムであるため、使用 しません。ただし、使用する他のサービス/プログラムは、特別な方法でスワップに依存する場合があります。私は本当に知りませんが、それはキャッシュまたはドライバーがスワップ空間へのアクセスを要求する特別な方法と関係があるかもしれません。tmpfstmpfstmpfstmpfs
rozcietrzewiacz

Linuxが仮想メモリをどのように処理するかについて、私には理解できないことがあります。可能な限りほとんどの方法でスワップを無効にしました:via swapoff、およびvia vm.swappiness=0。しかし、kswapd0まだ実行されます!これは2.4日からの回帰なの
でしょ

5
@syockit予想される動作です。システムはまだクリーンページ(ファイルデータのコピーを含むページ)を交換しています。クリーンページはスワップ以外のソースから読み戻すことができるため、クリーンページをスワップするためのスワップスペースは必要ありません。
デビッドシュワルツ

2

各ブート後に/etc/fstab実行するよりも、スワップパーティションエントリをコメントアウトすることをお勧めしswapoff -aます。

ハードウェア上のkswapd0でも同じ問題が発生します。

vm.swappinessシステムパラメータの調整は役に立ちません。

sysctl -w vm.swappiness=0

私はグーグルで多くの投稿やメーリングリストを読みましたが、今ではこれがカーネルのバグだと思います。

アクティブなスワップパーティションがなく、空きメモリがしきい値(私の場合は約300MB)より少なくなると、システムはkswapd0の狂気のために応答しなくなります。

おそらく、特別な構成と条件で再現されています。

誰かのために、それはkswapd0無効にされたカスタムカーネルを構築することにより、他の人のために再パーティションでシステムの再インストールによって解決されます。


2
場合はkswapd0狂って、あなたはスワップを使用すると、RAMの外出起動していません。選択できるのは、OOM Killerまたはkswapd0です。Linuxはkswapd0、プロセスを中止するよりもゆっくりと終了することがより重要であるとカーネルが想定しているためです。カジュアルな人間にとって、カーネルが十分な前進がまだ起こっていると考える閾値はすでに氷河のように遅く、ほとんど誰もがOOM Killerを選択するでしょう。
ミッコランタライネン

1

私のシステム(debian sid 2016-11-15)では、これを行いました:

  1. 今すぐスワップを無効にします。

    swapoff -a
    
  2. / etc / fstabのスワップパーティションを含む行をコメント化する

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. systemdでスワップのマウントを無効にします。

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

それで十分でしょう。/etc/initramfs-tools/conf.d/resumeファイル内のスワップの参照があります。これの目的が何なのかわかりません。たぶん、このファイルは次回の再起動時に問題になるでしょう(私はまだ再起動を試みません、私の稼働時間は貴重です;))。


1

バックグラウンドでの激しいI / Oスループットでコンピューターがハングします。iotopはkswapd0が犯人であることを明らかにします

私はそれを避けるための1つの方法(今のところ)を見つけました。それをテストし、システムでどのように機能するかを確認したい場合は、この質問内のカーネルパッチを参照してください。基本的に、メモリが圧迫されている場合は(少なくとも)ページを削除しません。したがって、OSをフリーズする代わりに、ディスクスラッシング(一定の読み取り)はほとんどゼロになり、OOM-killerは1秒以内にトリガーされます恒久的(または少なくとも数分間)。私は(私はありませんいる)実際のプログラマは、今彼らは何それがないことのために働いていることがわかりいること、パッチを改善し、実際のソリューションにそれを作るだろうと期待しているこれらの状況。 Active(file)


このカーネルパッチは既にメインライン化されていますか?
humanityANDpeace

@humanityANDpeaceはおそらくそうではありません、それはそれほど良くないからです(私はプログラマーではないので)が、たとえば、ワークロードに応じてこのパッチを使用すると、場合によってはメモリが不足する可能性がありますここでこのパッチなしで、あなたは持っていないと私は実行しない限り、これOOM-killerが、Xorgのとxfwm4を殺すecho 1 | sudo tee /proc/sys/vm/drop_cachesときActive(file):(のの/ proc / meminfoに)-itは最大4Gに行くことができます(16G RAMのシステム上で)2ギガバイトを超えています
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.