Linux:可能なすべてを明示的にアンスワップする方法は?


59

私は大量のメモリを必要とするものを立ち上げましたが、今ではすべてがかなり遅れています。すべてのアプリケーションのメモリは、メモリを集中的に使用するプロセスのために一部のスペースを解放するためにスワップし、現在ではすべてがアクセス時にゆっくりとRAMに戻ります。

スワップからRAMに可能なすべてを明示的に移動する方法はありますか?それともすべてではないかもしれませんが、いくつかの特定のデータを処理するだけですか?

回答:


59

実際に使用されているものは、使用されているため、通常のLinuxメモリ制御スワップを許可することをお勧めします。

私が考えることができる唯一のことは、スワップをオフにしてから再びオンにすることです

sudo swapoff -a
sudo swapon -a

これは、スワップ内のすべてを格納するのに十分な予備の物理メモリがあることを前提としています...


4
非常にゆっくりですが、動作します:)ありがとう!しかし、それでも私はもっとエレガントな解決策があると信じています:)
kolypto

7
このソリューションに注意して、スワップからすべてを強制的に削除します。物理メモリに収まらない場合、カーネルは致命的なOOMキラーを開始します。「すべてをRAMに移動しようとしましたが、不可能な場合は正常に失敗します」という素晴らしいコマンドは知りません。
ジュリアーノ

1
私はそれを試してみましたが、動作が非常に遅いことがわかりました。したがって、空きRAMを監視し、swapoffメモリが少なくなった場合に
強制終了

2
swapoffを強制終了しても実際に操作が停止するかどうかはわかりません。実装方法によって異なります。
ダグラスリーダー

3
swapoffコマンドは、「スワップへの新しい書き込みを許可しない」などの処理を実行し、他の実行中のプロセス(スワップを使用していた/使用している)は「スワップを解放」することができます。これが非常に遅いように見える理由かもしれません。他の人が言ったようにOOMを引き起こさないようです(私はUbuntu Bionicを使用しています)-「追加の(または既存の)プロセスが新しいメモリを使用し始める」(つまり、実際のOOM)場合にのみそうです。そのため、swapoff / swaponのすべてが優れたソリューションのようです。穏やか/安定。これは、プロセスを使用してより多くのメモリを開始しない(または実行中のプロセスで消費を増やす)ことを前提としています。
ロエルヴァンデパール

13

0から100までの数をエコーするように調整でき/proc/sys/vm/swappinessます。

このコントロールは、カーネルがメモリページをどれだけ積極的にスワップするかを定義するために使用されます。値を大きくすると攻撃性が高まり、値を小さくするとswapの量が減ります。0の値は、空きページとファイルバックアップページの量がゾーン内の最高水準点を下回るまでスワップを開始しないようにカーネルに指示します。

デフォルト値は60です。


13
/ proc / sysを直接使用せず、sysctl代わりにコマンドを使用してください。この場合、それはsysctl vm.swappiness=xです。
ジュリアーノ

7
swappinessが0であっても、すでにスワップされているページがメインメモリに明示的に取り込まれるとは思わないのですか?
ダグラスリーダー

1
@ダグラスは正しい。vm.swappinessは、主に、メモリが要求されたときに、物をスワップするか、キャッシュとバッファの量を減らすかを決定します。
ジュリアーノ

@Juliano、なぜ/ proc / sysを使用すべきではないのですか?
ジェームズ

@Jamesは、/ proc / sysがカーネル構成の変更とクエリに使用される低レベルのインターフェイスであるためです(「実装の詳細」です)。Linuxは、sysctlユーザーとの対話のための高レベルのコマンドを提供します。最終結果は同じですが、通常、ユーザーが直接対話するためには、より高レベルのインターフェイスが好まれます。キーを回すだけ(高レベル)ではなく、イグニッションワイヤーを短絡して(低レベル)エンジンを始動するのが好きです。
ジュリアーノ

5

Linuxはメモリをうまく管理しているので、邪魔にならないでください。vm.swappiness設定(前述)が邪魔になりません。他の方法で何かを行うと、奇妙な問題が発生する可能性が高くなります。

そんなに空腹だったメモリを起動したのは何ですか?調整できますか?独自のメモリ制限ディレクティブがない場合は、ulimitも確認できます。


私の場合はそうでしたconvert -density 200 file.pdf jpegs/file.jpg。何らかの理由で大量のメモリを使用しますが、あなたは正しいです:調整できます。とにかく、状況はどのアプリケーションでも可能です:)
kolypto

1
私はこの答えに同意します-あなたはおそらく実際に必要なものに交換するためにマシン上で通常の操作を残すべきです
ダグラスリーダー

convert-limitメモリとディスクの使用量を制御するための引数があり、それらを参照する必要があります。設定-limit memory 512MBなどは良いでしょう。また、明示的なMAGICK_TEMPORARY_PATHを指定して、コマンドの実行後にクリーンアップすることもできます。
怠acyな

3

すべてのアプリケーションで使用可能なメモリがある場合は、swappinessを0に設定しても問題はありません。たとえば、qemu-kvmは、ほとんどの時間アイドル状態に「見える」ため、VMMがスワップアウトされる大きなターゲットです。qemu-kvmメモリーのメモリーの最大80%がスワップに書き込まれます。qemu-kvmで実行されているVMは、スワップが不足しているため、ほぼ応答しなくなります(ただし、ゲストはこれが起こっていることを知りません)。ゲストVMは、実際にはひどく引きずられているにもかかわらず、最も優れたパフォーマンスを発揮すると考えます。大量のVMが「起動」して処理を開始すると、十分な高速メモリとディスクを備えたエンタープライズグレードのハードウェアであっても、負荷平均が最大30を超えることがあります。これは、すぐに使用可能なqemu-kvm設計では失敗していると思います。

これが誰かを助けることを願っています。


これはあまり正確ではないのではないかと思います。
Marc.2377

2

カーネル内のVMサブシステムを考え直そうとすることはお勧めしません。実際に、あなたがそれよりも良い決定を下すのに十分な情報を持っていることはめったにありません。そして、どうにかして間違ったことをするように強制すると、あなたは物事をさらに遅くすることになります。


9
OPが望むことをやりたい場合があります。誤ってプロセスを暴動させ、RAM + swapをすべて使用させてしまった場合、メモリをスワップから解放するためにアプリケーションを切り替えるたびに15秒待機するか、強制的に実行してすべてを通常どおり高速に実行できます。
アレックス14年

さて...アプリケーションを切り替えようとするたびにではなく、コーヒーブレーク中に「アンスワップ」が発生するようにします。障害のあるコーヒーブレイクを通知したいのは、「VMサブシステムを考え抜いている」のでしょうか?
Klaws

1

システムをリブートできれば、それを行う必要があります(他のソリューションを試すよりもはるかに短い時間で済みます)。


1

この質問から私の回答の一部をコピーします。

これで、swappiness調整可能パラメータの仕組みがわかります。これは、プロセスページテーブルにマッピングされたメモリの%+ swappiness値が100を超える場合、スワップするページを探すようにVMサブシステムに指示することで機能します。したがって、60に設定すると、システムはプロセスページテーブルから古いページのページングを開始しますシステムのメモリの40%以上を使用している場合。キャッシュを犠牲にしてプログラムでより多くのメモリを使用できるようにする場合は、swapiness値を低くする必要があります。


ここでは、プログラムメモリとキャッシュの問題はないと思います。アプリケーションメモリと未使用メモリの問題だと思います。そして、私はswappinessがそれに影響するとは思わない。
ダグラスリーダー

0

プロセスはまだ実行中ですか?ターミナルを開き、起動されたプロセスを見つけることができるかどうかを確認します。(ps aux | grep processnameを使用すると、少し簡単になる可能性があります)kill -9 PIDを使用して、まだ実行されている場合はそれらを強制終了します。殺すものに注意してください。プロセスが何であるかわからない場合、それを殺さないでください!また、free -mの出力を投稿して、実際にまだ多くのスワップを使用しているかどうかを確認できるようにします。

まだ実行速度が遅い場合は、起動したものがまだ実行されている可能性があります。あなたが何をしているのかを本当に知っているか、端に住んでいるのが好きでない限り、私は決してスワップをオフにしません。=)


0

Linuxのデータをディスクからメモリに強制的にスワップ解除する本当に良い方法はないと思います。swapoff / swaponは有効なソリューションですが、汚れているためシステムが不安定になる可能性があります。スワップに空きメモリよりも多くのデータがある場合、Linuxがメモリに移動するデータとディスクに保持するデータを決定するために使用できる効率的なポリシーを想像するのは困難です。

概要:Linuxに、通常の方法で徐々にパフォーマンスを回復させてください。そのVMサブシステムは、常に理想的なバランスのとれた状態に移行するように構成されています。


-2

バッファキャッシュを空にする

それらを空にしたい場合は、この一連のコマンドを使用できます。

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

上記のコマンドの数値引数を変更することで、キャッシュされたアイテムのさまざまな側面を削除するようにLinuxカーネルに通知できます。

注:不要なもののメモリをクリーンアップします(カーネル2.6.16以降)。必ず同期を実行して、有用なものをディスクにフラッシュしてください!!!

  • ページキャッシュを解放するには:

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • デントリとiノードを解放するには:

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • ページキャッシュ、デントリ、およびiノードを解放するには:

    $ echo 3 > /proc/sys/vm/drop_caches
    

上記はルートとして実行されることを意図しています。sudoを使用してそれらを実行しようとしている場合、構文を次のようなものにわずかに変更する必要があります。

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.