RAMとスワップ領域の両方を使い果たしたため、バックグラウンドでソフトウェアをコンパイルしているときに突然起こり、突然すべてがスローダウンし、最終的にフリーズします(何もしない場合)。
この質問は、Gnomeターミナルを開き、履歴を検索し、1つのSudo
コマンドを実行するのに十分な時間とリソースがあることを前提としています。
どのコマンドを使用すると、ハードリブートを実行したり、リブートを実行したりする必要がなくなりますか?
私の経験では、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時間ごとに課金されます。
Magic System Request Keyが有効になっているシステムで、 Alt + System Request + f (キーボードでマークされていない場合、 System Request しばしば Print Screen キー)は、カーネルのメモリ不足キラー(oomkiller)を手動で呼び出します。これは、メモリ使用量の最悪の違反プロセスを選択して強制終了しようとします。説明よりもおそらく時間が短く、システムがスラッシングを開始しようとしている(または既に開始している)場合は、これを行うことができます。使用可能なシステムを準備します。これによりXが強制終了される場合もありますが、最近ではほとんどの場合、以前よりも悪いプロセスを選択する方がはるかに優れています。
他の回答とは異なり、これを行っている間はスワップを無効にすることをお勧めします。スワップはシステムを予測可能な方法で実行し続け、ディスクにアクセスするアプリケーションのスループットを向上させるために使用されますが(ディスクキャッシュのスペースを確保するために未使用のページを排除することにより)、この場合、システムがスローダウンしているように聞こえますあまりにも多くのアクティブに使用されているメモリが強制的にスワップに追い出されているため、使用できないレベルになります。
RAMがいっぱいになるとすぐにメモリ不足のキラーが動作するように、このタスクを実行している間はスワップを完全に無効にすることをお勧めします。
代替ソリューション:
zswap
を有効にしてみてください。これにより、ページがスワップに送信される前に圧縮されます。これにより、マシンを高速化するのに十分な余地があります。一方で、余分な圧縮/解凍の妨げになるだけです。tcc
)でプロジェクトをコンパイルしてみてください。 (開発/デバッグの目的でこれを行っている場合、これは通常許容されます。)次のコマンドを(必要に応じて繰り返し)使用して、システムで最も多くの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
にしたくないタスク)が実行されていない場合に実行する必要がある、迅速で汚いソリューションです。
これはかなり頻繁に起こりますバックグラウンドでソフトウェアをコンパイルしているとき
その場合、 "killall -9 make"(または、makeでない場合はコンパイルの管理に使用しているもの)のようなものです。これにより、コンパイルがさらに停止し、そこから起動されたすべてのコンパイラプロセスがSIGHUPされ(うまくいけばそれらも停止します)、ボーナスとして、ログインしているのと同じユーザーとしてコンパイルしていると仮定すると、Sudoは必要ありませんとして。また、Webブラウザ、Xセッション、または何らかのプロセスの代わりに、問題の実際の原因をランダムに殺すので、その時点でシステムで行っていた他の操作に干渉しません。
リソースを消費するコマンドを実行する前に、 setrlimit(2) システムコールを使用し、おそらく ulimit
組み込みbashシェル (またはlimit
zshに組み込まれています)特に-v
でRLIMIT_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) を参照してください...)。
自分用にさらにスワップを作成します。
以下は、8Gのスワップを追加します。
dd if=/dev/zero of=/root/moreswap bs=1M count=8192
mkswap /root/moreswap
swapon /root/moreswap
それでも遅くなりますが(交換中)、実際に使い果たすべきではありません。 Linuxの最新バージョンはファイルにスワップできます。最近のスワップパーティションの唯一の用途は、ラップトップを休止状態にすることです。
短い通知で空きRAMのチャンクを取得する1つの方法は、圧縮されたRAMディスクを作成し、そこでスワップする zram を使用することです。半分まともなCPUでは、これは通常のスワップよりもはるかに高速であり、Webブラウザーのような多くの最新のRAM豚では圧縮率がかなり高くなっています。
Zramをインストールして構成していると仮定すると、実行する必要があるのは実行するだけです
Sudo service zramswap start
もう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」を実行できます。これにより、システム上のダーティオブジェクトの数が最小化され、ドロップされる候補がさらに作成されます。
Sudo swapoff -a
はスワップを無効にし、システムがメモリ不足になると、カーネルが 最高スコア でプロセスを自動的に強制終了します。 RAMを大量に使用することがわかっている場合は、これを使用します。これは、スワップ状態になって永久にスタックするよりも、制御不能になった場合に殺す方がよいでしょう。 Sudo swapon -a
を使用して、後で再度有効にします。
後で、スワップ設定を確認することをお勧めします。スワップはルートパーティションと同じディスク上にあるように聞こえますが、スワップをヒットするとシステムの速度が低下するため、可能であればそれを避けてください。また、私の意見では、現代のシステムは多くの場合、スワップが多すぎます。 32GiB RAMは通常、32GiBを実際にスワップスペースに入れたいかのように、デフォルトで32GiBスワップが割り当てられることを意味します。
「バックグラウンドでコンパイルする」と言いました。フォアグラウンドで何をしていますか? Eclipseまたは他のリソースの多いIDEで開発している場合は、すべてがコンソールで適切に終了しているかどうかを確認してください。
開発環境では、多くの場合、開発中の複数のプロセスを開始できます。これらのプロセスは、(デバッガーで、または適切に終了しなかった)興味がなくなった後もハングしたままになることがあります。開発者が注意を払わないと、忘れられた数十のプロセスが1日に蓄積され、複数のギガバイトが一緒に使用されます。
IDEで終了する必要があるすべてのものが終了しているかどうかを確認します。