web-dev-qa-db-ja.com

UbuntuはすぐにRAMを使い果たし、私のコンピューターはフリーズし始めています。これを解決するコマンドは何ですか?

RAMとスワップ領域の両方を使い果たしたため、バックグラウンドでソフトウェアをコンパイルしているときに突然起こり、突然すべてがスローダウンし、最終的にフリーズします(何もしない場合)。

この質問は、Gnomeターミナルを開き、履歴を検索し、1つのSudoコマンドを実行するのに十分な時間とリソースがあることを前提としています。

どのコマンドを使用すると、ハードリブートを実行したり、リブートを実行したりする必要がなくなりますか?

73
Akiva

私の経験では、FirefoxとChromeは最初の7台のコンピューターを組み合わせたよりも多くのRAMを使用します。おそらくそれ以上ですが、私は自分の主張から離れています。最初にすべきことはブラウザを閉じるです。コマンド?

killall -9 firefox google-chrome google-chrome-stable chromium-browser

最も人気のあるブラウザーを1つのコマンドにまとめましたが、明らかに他の何かを実行している場合(またはこれらのいずれかを使用していないことがわかっている場合)は、コマンドを変更するだけです。 killall -9 ...は重要なビットです。人々はSIGKILL(シグナル番号9)について不確かになりますが、ブラウザは非常に回復力があります。それ以上に、SIGTERMを介してゆっくりと終了すると、ブラウザがクリーンアップのゴミをロードすることを意味します-これは追加のRAMのバーストを必要としますが、この状況では余裕がありません。

既に実行中の端末またはそれを取得できない場合 Alt+F2 対話、TTYへの切り替えを検討してください。 Control + Alt + F2 TTY2が表示され、ログインが可能になります(ただし、時間がかかる場合があります)。また、htopなどを使用して問題をデバッグすることもできます。 RAMを使い果たしてhtopを取得できなかったとは思いません。

長期的な解決策には、RAMを追加購入するか、リモートコンピューター経由でレンタルするか、現在実行していることを実行しないことが含まれます。複雑な経済的議論はあなたにお任せしますが、一般的に、RAMは安価に購入できますが、バースト量のみが必要な場合、VPSサーバーは1分または1時間ごとに課金されます。

84
Oli

Magic System Request Keyが有効になっているシステムで、 Alt + System Request + f (キーボードでマークされていない場合、 System Request しばしば Print Screen キー)は、カーネルのメモリ不足キラー(oomkiller)を手動で呼び出します。これは、メモリ使用量の最悪の違反プロセスを選択して強制終了しようとします。説明よりもおそらく時間が短く、システムがスラッシングを開始しようとしている(または既に開始している)場合は、これを行うことができます。使用可能なシステムを準備します。これによりXが強制終了される場合もありますが、最近ではほとんどの場合、以前よりも悪いプロセスを選択する方がはるかに優れています。

66
Muzer

他の回答とは異なり、これを行っている間はスワップを無効にすることをお勧めします。スワップはシステムを予測可能な方法で実行し続け、ディスクにアクセスするアプリケーションのスループットを向上させるために使用されますが(ディスクキャッシュのスペースを確保するために未使用のページを排除することにより)、この場合、システムがスローダウンしているように聞こえますあまりにも多くのアクティブに使用されているメモリが強制的にスワップに追い出されているため、使用できないレベルになります。

RAMがいっぱいになるとすぐにメモリ不足のキラーが動作するように、このタスクを実行している間はスワップを完全に無効にすることをお勧めします。

代替ソリューション:

  • スワップパーティションをRAID1 に配置して、スワップの読み取り速度を上げます。
    • または、危険を感じている場合でもRAID0を使用しますが、ディスクのいずれかが故障すると、実行中のプログラムが大量に停止します。
  • 並行ビルドジョブの数を減らします(「コアが増える=速度が上がる」、RAMに直線的な負荷がかかることを忘れてしまいます)
  • これは両方の方法で実行できますが、カーネルでzswapを有効にしてみてください。これにより、ページがスワップに送信される前に圧縮されます。これにより、マシンを高速化するのに十分な余地があります。一方で、余分な圧縮/解凍の妨げになるだけです。
  • 最適化を下げるか、別のコンパイラを使用します。コードを最適化すると、数ギガバイトのメモリを消費する場合があります。 LTOを有効にしている場合は、リンク段階でも多くのRAMを使用します。他のすべてが失敗した場合は、コンパイルされた製品にわずかなランタイムパフォーマンスヒットを犠牲にして、より軽量のコンパイラ(たとえばtcc)でプロジェクトをコンパイルしてみてください。 (開発/デバッグの目的でこれを行っている場合、これは通常許容されます。)
20
Score_Under

次のコマンドを(必要に応じて繰り返し)使用して、システムで最も多くのRAMを使用しているプロセスを強制終了できます。

ps -eo pid --no-headers --sort=-%mem | head -1 | xargs kill -9

と:

  • ps -eo pid --no-headers --sort=-%mem:実行中のすべてのプロセスのプロセスIDをメモリ使用量でソートして表示します
  • head -1:最初の行のみを保持します(ほとんどのメモリを使用するプロセス)
  • xargs kill -9:プロセスを強制終了します

Dmitryの正確なコメントの後に編集します。

これは、デリケートなタスク(kill -9にしたくないタスク)が実行されていない場合に実行する必要がある、迅速で汚いソリューションです。

14
Gohu

これはかなり頻繁に起こりますバックグラウンドでソフトウェアをコンパイルしているとき

その場合、 "killall -9 make"(または、makeでない場合はコンパイルの管理に使用しているもの)のようなものです。これにより、コンパイルがさらに停止し、そこから起動されたすべてのコンパイラプロセスがSIGHUPされ(うまくいけばそれらも停止します)、ボーナスとして、ログインしているのと同じユーザーとしてコンパイルしていると仮定すると、Sudoは必要ありませんとして。また、Webブラウザ、Xセッション、または何らかのプロセスの代わりに、問題の実際の原因をランダムに殺すので、その時点でシステムで行っていた他の操作に干渉しません。

11
fluffysheap

リソースを消費するコマンドを実行する前に、 setrlimit(2) システムコールを使用し、おそらく ulimit組み込みbashシェル (またはlimit zshに組み込まれています)特に-vRLIMIT_ASを使用しています。次に、仮想アドレス空間の消費が大きすぎます(たとえば mmap(2) または sbrk(2)malloc(3) で使用される)は失敗します( errno(3) being ENOMEM)。

その後、それらは(つまり、ulimitと入力した後のシェルの空腹プロセス)システムをフリーズする前に終了します。

また、 Linux Ate My RAM を読んで、無効にすることを検討してください memory overcommitment (rootとしてecho 0 > /proc/sys/vm/overcommit_memoryコマンドを実行して、 proc(5) を参照してください...)。

11

自分用にさらにスワップを作成します。

以下は、8Gのスワップを追加します。

dd if=/dev/zero of=/root/moreswap bs=1M count=8192
mkswap /root/moreswap
swapon /root/moreswap

それでも遅くなりますが(交換中)、実際に使い果たすべきではありません。 Linuxの最新バージョンはファイルにスワップできます。最近のスワップパーティションの唯一の用途は、ラップトップを休止状態にすることです。

9
William Hay

短い通知で空きRAMのチャンクを取得する1つの方法は、圧縮されたRAMディスクを作成し、そこでスワップする zram を使用することです。半分まともなCPUでは、これは通常のスワップよりもはるかに高速であり、Webブラウザーのような多くの最新のRAM豚では圧縮率がかなり高くなっています。

Zramをインストールして構成していると仮定すると、実行する必要があるのは実行するだけです

Sudo service zramswap start
5

もう1つできることは、このコマンドを使用してメモリページキャッシュを解放することです。

echo 3 | Sudo tee /proc/sys/vm/drop_caches

kernel.org ドキュメンテーションから(強調を追加):

drop_caches

これに書き込むと、カーネルはクリーンなキャッシュと、デントリーやiノードなどの再生可能なスラブオブジェクトをドロップします。 一度削除されると、メモリは解放されます

ページキャッシュを解放するには:echo 1>/proc/sys/vm/drop_caches再生可能なスラブオブジェクト(デントリおよびiノードを含む)を解放するには:echo 2>/proc/sys/vm/drop_cachesスラブオブジェクトおよびページキャッシュを解放するには:echo 3>/proc/sys/vm/drop_caches

これは非破壊的な操作であり、ダーティなオブジェクトを解放しません。この操作によって解放されるオブジェクトの数を増やすために、ユーザーは/ proc/sys/vm/drop_cachesに書き込む前に「sync」を実行できます。これにより、システム上のダーティオブジェクトの数が最小化され、ドロップされる候補がさらに作成されます。

3

Sudo swapoff -aはスワップを無効にし、システムがメモリ不足になると、カーネルが 最高スコア でプロセスを自動的に強制終了します。 RAMを大量に使用することがわかっている場合は、これを使用します。これは、スワップ状態になって永久にスタックするよりも、制御不能になった場合に殺す方がよいでしょう。 Sudo swapon -aを使用して、後で再度有効にします。

後で、スワップ設定を確認することをお勧めします。スワップはルートパーティションと同じディスク上にあるように聞こえますが、スワップをヒットするとシステムの速度が低下するため、可能であればそれを避けてください。また、私の意見では、現代のシステムは多くの場合、スワップが多すぎます。 32GiB RAMは通常、32GiBを実際にスワップスペースに入れたいかのように、デフォルトで32GiBスワップが割り当てられることを意味します。

3
sudo

「バックグラウンドでコンパイルする」と言いました。フォアグラウンドで何をしていますか? Eclipseまたは他のリソースの多いIDEで開発している場合は、すべてがコンソールで適切に終了しているかどうかを確認してください。

開発環境では、多くの場合、開発中の複数のプロセスを開始できます。これらのプロセスは、(デバッガーで、または適切に終了しなかった)興味がなくなった後もハングしたままになることがあります。開発者が注意を払わないと、忘れられた数十のプロセスが1日に蓄積され、複数のギガバイトが一緒に使用されます。

IDEで終了する必要があるすべてのものが終了しているかどうかを確認します。

1
h22