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


73

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

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

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


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
トーマスウォード

1
スワップ領域が不足している場合は、不足していると思います。このコンピューターに20Gのスワップ領域がありました。重要なのは、メモリを使い果たしているものをすべて殺すために、使用可能なシステムで十分な時間を与えることです。使うものだけを手に入れるものではなく、決して使いたくないものです。
-JoL

1
RAMとスワップの両方がいっぱいになっていますか?その場合、OOMハンドラーはコンパイラーを強制終了し、メモリーを解放します(ビルドプロセスを台無しにします)。そうでなければ、私はそれがちょうどいっぱいになっていると思います、そしておそらくあなたのスワップがシステムディスク上にあるのであなたのシステムは遅いです。
須藤

3
サポートするのに十分なRAMがない場合は、並列ビルドの数を減らしてみてください。ビルドのスワッピングが開始されると、処理速度が遅くなります。で、例えば一度に4つの並列ビルドをmake試してください-j4
シャーバズ

1
「Alexaに8

回答:


84

私の経験では、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ものまたはそのようなものに減らすことができます
Francisco Presencia

どのブラウザが実行されているかがわかっていれば、完全なコマンドを実行する必要はありません。RAMの不足を特定できるほとんどの人が実行すると仮定します。emptyramひいては、単にパンチインするよりも、スクリプトを書いたことを思い出すのは難しいと思いますkillall -9 firefox
オリ

2
RAMを購入する... RAMをダウンロードするだけではどうですか?
ステファンBijzitter

1
冗談かもしれませんが、使用しているRAMとCPUをはるかに多く必要とする短時間の操作が必要な場合は、VPSを1分ごとにレンタルするのが一発でかなり経済的です。
オリ

66

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


5
@ T.Sarスラッシングに直行する場合、すでにメモリーイーターを失う可能性があるか、それを失う可能性があります。演技を控えるだけでは何も得られません。
ルスラン

4
@Muzerこれは、に設定されkernel.sysrqている1か、に正しいビットを含む数値が設定されている場合にのみ機能します/etc/sysctl.d/10-magic-sysrq.conf
ルスラン

9
@ T.Sar健全なビルドシステムを使用している場合、進行状況を失うことはありません。すべてのオブジェクトファイルを保持しますが、実際にコンパイルしていたファイルは保持し、その後、ほぼ中断したところに戻ります。
ミューザー

3
@ T.Sarコンパイルしていることが正気でないからといって、ビルドシステムが正気でないということではありません。太古からのビルドシステムには、後続のコンパイルで再利用するためのオブジェクトファイルが保存されていました。一方、私は確かに多くのソフトウェアプロジェクトにLinuxよりも正気度の低い名前を付けることができます(一般的にはかなりうまく設計されています)。たとえば、FirefoxやOpenOfficeのようなものを8つの並列ビルドスレッドでコンパイルすると、ギガバイトのRAMのオーダーでそれを簡単に見ることができます。何百ものライブラリに依存するモノリシックな企業システムもたくさんあります。
ミューザー

7
@ T.Sar Linuxは、コンパイラのPOVからそれほど複雑ではありません。実際には、Cプログラムはほとんどありません。C ++はどうですか?EigenまたはBoostを使用してプログラムをビルドしようとしたことがありますか?そのようなプログラムでコンパイラがときどき消費するメモリ量に驚かれることでしょう。そして、それらは複雑である必要はありません。
ルスラン

20

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

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

代替ソリューション:

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

6
スワップをオフにしている場合、それはメモリ不足の場合のLinuxの動作です。Linuxがメモリ不足キラーを呼び出さず、代わりにフリーズする場合は、セットアップにさらに深い問題があることを示している可能性があります。もちろん、スワップがオンになっている場合、動作はわずかに異なります。
Score_Under

10
@Akivaスワップなしで試したことはありますか?この答えはスポットオンです。sudo swapoff -aすでにバインドしているときに実行するとあなたを救うかもしれないことを追加したいと思います:スワップスペースの追加使用を即座に停止します。つまり、OOMキラーは次の瞬間に呼び出され、マシンを正常に動作させる必要があります。sudo swapoff -aまた、メモリリークをデバッグするときや、Firefoxなどをコンパイルするときの優れた予防策です。通常、スワップは少し便利です(たとえば、休止状態や実際に不要なものをスワップアウトする場合)が、実際にメモリを使用している場合、フリーズはさらに悪くなります。
ジョナスシェーファー

2
@Score_Under:各ディスク上の個別のスワップパーティションは、md raid0デバイス上のスワップよりもはるかに効率的であると想定されています。読んだ場所を忘れてしまいました。 Linux RAID wikiでは、raid0よりも個別のパーティションを推奨していますが、なぜそれが優れているのかについては非常に強力なことは述べていません。とにかく、RAID1またはRAID10n2はスワップに意味があります。特に、ページキャッシュ用にRAMを残すためにダーティだが非常にコールドなページをスワップアウトしたい場合は特にそうです。すなわち、スワップのパフォーマンスは大したことではありません。
ピーターコーデス

2
私のポイントは、あなたのアドバイスに従うと、スワップが必要なため、それらのプログラムをまったく実行できないかもしれないということです。100%の確率で失敗するビルドは、システムをロックする可能性が50%あるビルドよりも劣っていませんか?
ドミトリーグリゴリエフ

2
スワップなしでは、多くのマシンで大量のコードをコンパイルすることは不可能です。彼が犠牲にしたいコンパイルだと思うのはなぜですか?
デビッドシュワルツ

14

次のコマンドを(必要に応じて繰り返し)使用して、システム上のほとんどの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


5
これは、OOMキラーに状況を処理させるよりもはるかに悪いです。OOMキラーはそれよりもはるかに賢いです。コンパイルが進行中のコンピューターで実際にそのようなコマンドを実行していますか?
ドミトリーグリゴリエフ

@DmitryGrigoryev私のデスクトップで時々Xorgを殺すのはとても賢いです。最新のカーネルでは、OOMKはある程度の健全性を獲得しているように見えますが、結局はそれを本当に信用しません。
ルスラン

11

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

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

Linux Ate My RAMも読んで、メモリーのオーバーコミットを無効にすることを検討してecho 0 > /proc/sys/vm/overcommit_memory ください rootとしてコマンドを実行することにより、proc(5)を参照)。


11

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

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


2
この答えを見つけるためにこれまでスクロールしなければならなかったのは残念です。このRAMイーターの進行を一時停止する方法を誰かが提案してくれることを期待していました。
-TOOGAM

OPが期待する答えに近いものではありませんが、文学的な質問に答えています。
9ilsdx 9rvj 0lo

9

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

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

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

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


1
実際に、このメソッドをスクリプトとして実装しています。その場でスワップを追加するのに非常に便利です。
セルギーKolodyazhnyy

7
一般に、一部のスワップは賢明ですが、大量に割り当てると、OOMキラーが介入してボランティアを選ぶ前に、マシンを単にスラッシングさせることができます。「スワップとしてRAMを2倍にする」ことについての親指の古い役割は、長い間死んでいます。個人的には、合計で約1 GBを超えるスワップを割り当てることに値はありません。
クリギー

5
ext4を使用すると、fallocate -l 8G /root/moreswap代わりにdd、システムがスラッシングしている間に8GBのI / Oを行う必要を回避できます。ただし、これは他のファイルシステムでは機能しません。確かに、XFSではなく、swaponは未書き込みのエクステントをホールと見なします。(私はこのxfsメーリングリストの議論はうまくいかなかったと思います)。swapdディスクスペースを節約するためにオンザフライでスワップファイルを作成/削除するデーモンも参照してください。またaskubuntu.com/questions/905668/...
ピーター・コルド

1
@Criggie「個人的には、合計で最大1 GBのスワップを割り当てることに値がありません」-Firefoxをビルドしようとしましたか?
ドミトリーグリゴリエフ

1
@Akiva前回確認したとき、推奨されるビルド構成は16 GBのRAMでした。メインの実行可能ファイル(xul.dll)は約50 MBであるため、Linuxカーネルよりも約10倍重いです。
ドミトリーグリゴリエフ

5

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

zramがインストールおよび構成されていると仮定すると、実行する必要があるのは実行するだけです

sudo service zramswap start

これは、btrfsのようなすべてのファイルシステムで動作しますか?
アキバ

1
@Akiva zramはディスクに触れないので、「はい」と言います;)
Dmitry Grigoryev

3

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

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


ああ、どこかで誰かがそれをコメントしたのを見た。
sudoの

3

もう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」を実行できます。これにより、システム上のダーティオブジェクトの数が最小限に抑えられ、ドロップされる候補がさらに作成されます。


興味深い...そのコマンドロジックを説明することに注意してください。
アキバ

1
@Akivaは基本的に、LinuxカーネルにRAMを解放するよう指示します。これは原因となっているプロセスを殺す原因を取り除きませんので、Oliの答えは問題の解決策です。キャッシュを削除すると、システムのメモリ不足が防止されるため、フリーズアウトが防止され、実際の問題を把握するための時間を節約できます。これはおそらく、あなたは、ハードドライブ上ではなくSSDにしている場合は特に、スワップファイルを作成するよりも少し速くなります
Sergiy Kolodyazhnyy

7
キャッシュは、メモリがいっぱいになったときに最初に移動するものであるため、これがあまり役立つとは思いません。実際、このコマンドは、カーネルの動作のデバッグやディスクアクセスの最適化のタイミング以外に実用的ではないと思います。パフォーマンスを必要とするシステムでこのコマンドを実行しないことをお勧めします。
Score_Under

2
@Score_Under-「メモリがいっぱいになると、キャッシュが最初に移動します」-それは、の設定に依存します/proc/sys/vm/swappiness。swappinessを0に設定すると、その通りです。デフォルト設定の60で、あなたは閉じています。ただし、200に設定すると、最初にドロップされるのは実行中のプロセスの使用頻度が最も低いページになります...その特定の場合、このコマンド便利です。ただし、swappinessを0(またはいくつかの低い値、おそらく20または30)に設定する方が一般的なアプローチです。
ジュール

3
@Score_Underこのコマンドは、kswapdバグのある古いカーネルで役に立ちました(一部の人々はそれでcronjobsを作成しました)。しかし、あなたは正しい、私はそれがこの質問に役立つとは思わない。
ドミトリーグリゴリエフ

1

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.