バックグラウンドでソフトウェアをコンパイルしているとき、RAMとスワップスペースの両方を使い果たしたため、突然すべてがスローダウンし、最終的にフリーズします(何もしない場合)。
この質問は、Gnomeターミナルを開き、履歴を検索して、1つのsudo
コマンドを実行するのに十分な時間とリソースがあることを前提としています。
どのコマンドを使用すると、ハードリブートを実行したり、リブートを実行したりする必要がなくなりますか?
make
試してください-j4
。
バックグラウンドでソフトウェアをコンパイルしているとき、RAMとスワップスペースの両方を使い果たしたため、突然すべてがスローダウンし、最終的にフリーズします(何もしない場合)。
この質問は、Gnomeターミナルを開き、履歴を検索して、1つのsudo
コマンドを実行するのに十分な時間とリソースがあることを前提としています。
どのコマンドを使用すると、ハードリブートを実行したり、リブートを実行したりする必要がなくなりますか?
make
試してください-j4
。
回答:
私の経験では、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+ F2TTY2が表示され、ログインが可能になります(ただし、時間がかかる可能性があります)htop
。RAMが使い果たせないほど使い果たされたとは思いませんhtop
。
長期的な解決策には、RAMを追加購入するか、リモートコンピューター経由でレンタルするか、現在実行していることを実行しないことが含まれます。複雑な経済的議論はあなたにお任せしますが、一般的に言えば、RAMは安価に購入できますが、バースト量のみが必要な場合は、VPSサーバーが毎分または時間単位で請求されます。
lazygit
時々使用する自分のコマンドにリンクされたコマンドをいくつか取得しましたが、そのようなものをここで適用できますか?killall ...
スクリプト全体を単純なemptyram
ものまたはそのようなものに減らすことができます
emptyram
ひいては、単にパンチインするよりも、スクリプトを書いたことを思い出すのは難しいと思いますkillall -9 firefox
。
Magic System Request Keyが有効になっているシステムでは、Alt + System Request+ f(キーボードにマークされていない場合、System Request多くの場合はPrint Screenキーにあります)を押すと、カーネルのメモリ不足キラー(oomkiller)が手動で呼び出され、最悪の違反プロセスを選択しようとしますメモリ使用量とそれを殺します。説明よりもおそらく時間が短く、システムがスラッシングを開始しようとしている(または既に開始している)場合は、これを行うことができます-その場合、おそらく何が殺されるかを正確に気にせず、単に終了するだけです使用可能なシステムを準備します。時々これはXを殺してしまうことがありますが、最近ではほとんどの場合、以前よりも悪いプロセスを選ぶ方がずっと良いです。
kernel.sysrq
ている1
か、に正しいビットを含む数値が設定されている場合にのみ機能します/etc/sysctl.d/10-magic-sysrq.conf
。
他の答えとは反対に、これをしている間はスワップを無効にすることをお勧めします。スワップはシステムを予測可能な方法で実行し続け、ディスクにアクセスするアプリケーションのスループットを高めるために使用されますが(ディスクキャッシュ用のスペースを確保するために未使用のページを排除することにより)、この場合はシステムがスローダウンしているように聞こえますあまりにも多くのアクティブに使用されているメモリが強制的にスワップに追い出されているため、使用できないレベルになります。
このタスクの実行中は、スワップを完全に無効にすることをお勧めします。これにより、RAMがいっぱいになるとすぐにメモリ不足のキラーが動作します。
代替ソリューション:
zswap
が、カーネルで有効にしてみてください。これにより、ページがスワップに送信される前に圧縮されます。これにより、マシンを高速化するのに十分なゆらぎ空間が提供される場合があります。一方で、余分な圧縮/解凍の妨げになるだけです。tcc
された製品にわずかなランタイムパフォーマンスヒットを犠牲にして、より軽量のコンパイラ(たとえば)でプロジェクトをコンパイルしてみてください。(開発/デバッグの目的でこれを行っている場合、これは通常許容されます。)sudo swapoff -a
すでにバインドしているときに実行するとあなたを救うかもしれないことを追加したいと思います:スワップスペースの追加使用を即座に停止します。つまり、OOMキラーは次の瞬間に呼び出され、マシンを正常に動作させる必要があります。sudo swapoff -a
また、メモリリークをデバッグするときや、Firefoxなどをコンパイルするときの優れた予防策です。通常、スワップは少し便利です(たとえば、休止状態や実際に不要なものをスワップアウトする場合)が、実際にメモリを使用している場合、フリーズはさらに悪くなります。
次のコマンドを(必要に応じて繰り返し)使用して、システム上のほとんどの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
。
リソースを消費するコマンドを実行する前に、おそらくfor とともにbashシェルの組み込み(またはzsh の組み込み)でsetrlimit(2)システムコールを使用することもできulimit
ます。次に、仮想アドレス空間の消費が大きすぎる(malloc(3)で使用されるmmap(2)またはsbrk(2 )など)が失敗します(errno(3)が)。limit
-v
RLIMIT_AS
ENOMEM
それからulimit
、システムをフリーズする前に、それら(つまり、入力後のシェルの空腹プロセス)は終了します。
Linux Ate My RAMも読んで、メモリーのオーバーコミットを無効にすることを検討してecho 0 > /proc/sys/vm/overcommit_memory
ください( rootとしてコマンドを実行することにより、proc(5)を参照)。
これは、バックグラウンドでソフトウェアをコンパイルしているときによく起こります
その場合、 "killall -9 make"(または、makeでない場合はコンパイルの管理に使用しているもの)のようなものです。これにより、コンパイルがさらに停止し、そこから起動されたすべてのコンパイラプロセスがSIGHUPされ(同様に停止することが望ましい)、ボーナスとして、ログインしているのと同じユーザーとしてコンパイルしていると仮定すると、sudoは必要ありませんとして。また、Webブラウザ、Xセッション、または何らかのプロセスの代わりに、問題の実際の原因をランダムに殺すので、その時点でシステムで行っていた他の操作に干渉しません。
自分用にさらにスワップを作成します。
以下は8Gのスワップを追加します:
dd if=/dev/zero of=/root/moreswap bs=1M count=8192
mkswap /root/moreswap
swapon /root/moreswap
それでも遅くなりますが(交換中)、実際に使い果たすべきではありません。最新バージョンのLinuxはファイルにスワップできます。最近のスワップパーティションの唯一の用途は、ラップトップを休止状態にすることです。
fallocate -l 8G /root/moreswap
代わりにdd
、システムがスラッシングしている間に8GBのI / Oを行う必要を回避できます。ただし、これは他のファイルシステムでは機能しません。確かに、XFSではなく、swaponは未書き込みのエクステントをホールと見なします。(私はこのxfsメーリングリストの議論はうまくいかなかったと思います)。swapd
ディスクスペースを節約するためにオンザフライでスワップファイルを作成/削除するデーモンも参照してください。またaskubuntu.com/questions/905668/...
xul.dll
)は約50 MBであるため、Linuxカーネルよりも約10倍重いです。
すぐに空きRAMのチャンクを取得する1つの方法は、圧縮RAMディスクを作成してそこにスワップするzramを使用することです。半分まともなCPUであれば、これは通常のスワップよりもはるかに高速です。また、Webブラウザーのような多くの最新のRAMホグでは圧縮率がかなり高くなっています。
zramがインストールおよび構成されていると仮定すると、実行する必要があるのは実行するだけです
sudo service zramswap start
sudo swapoff -a
システムがメモリを使い果たした場合、カーネルが自動的に最高スコアのプロセスを強制終了させるスワップを無効にします。RAMを大量に使用することがわかっている場合は、これを使用します。これは、スワップ状態になって永久にスタックするよりも、制御不能になった場合に殺す方がよいでしょう。sudo swapon -a
後で再度有効にするために使用します。
後で、スワップ設定を確認することをお勧めします。スワップはルートパーティションと同じディスク上にあるように聞こえますが、スワップをヒットするとシステムの速度が低下するため、可能であればそれを避けてください。また、私の意見では、現代のシステムは多くの場合、スワップが多すぎるように構成されています。32GiB RAMは通常、32GiBをスワップスペースに本当に入れたいかのように、デフォルトで32GiBスワップが割り当てられることを意味します。
もう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」を実行できます。これにより、システム上のダーティオブジェクトの数が最小限に抑えられ、ドロップされる候補がさらに作成されます。
/proc/sys/vm/swappiness
。swappinessを0に設定すると、その通りです。デフォルト設定の60で、あなたは閉じています。ただし、200に設定すると、最初にドロップされるのは実行中のプロセスの使用頻度が最も低いページになります...その特定の場合、このコマンドは便利です。ただし、swappinessを0(またはいくつかの低い値、おそらく20または30)に設定する方が一般的なアプローチです。
kswapd
バグのある古いカーネルで役に立ちました(一部の人々はそれでcronjobsを作成しました)。しかし、あなたは正しい、私はそれがこの質問に役立つとは思わない。
「バックグラウンドでコンパイルする」と言いました。フォアグラウンドで何をしていますか?Eclipseまたは他のリソースの重いIDEで開発している場合は、すべてがコンソールで適切に終了しているかどうかを確認してください。
開発環境では、多くの場合、開発中の複数のプロセスを開始できます。これらのプロセスに興味がなくなった後(デバッガーで、または正しく終了しなかった場合)もハングし続けることがあります。開発者が注意を払わないと、忘れられた数十のプロセスが1日に蓄積され、複数ギガバイトを一緒に使用する可能性があります。
IDEで終了する必要があるすべてのものが終了しているかどうかを確認します。