
時には、処理のためにメモリ内に保持しておきたい大量のデータを扱うことがあります。プログラムが生成するメモリの量を誤って計算したり、デバッガーがメモリ使用量を使用可能なメモリを超える係数で乗算したりすることがあります。
メモリを大量に消費するプロセスを開始するたびに、正常なオペレーティング システムであれば、まずすべての空きメモリを使い果たそうとし、次に他の重要でないプロセスに不要なメモリを放棄するように丁寧に要求し、スワップに書き込みます。
Ubuntu が私に行うことは、空きメモリをすべて消費し、オペレーティング システムにすべての必須サービス (gnome セッション、ターミナル、キーボード) を交換するように要求し、フリーズして私が電源プラグを抜くのを待つことです。
2つの質問:
- オペレーティング システムは、何かが非常に重要であるため、ユーザー入力のリッスンを停止しても問題ないとどのように想定できるのでしょうか?
- 何らかの愚かなプロセスがシステムが提供する以上のリソースを消費しようとした場合でも、Ubuntu に重要なサービスをスワップせず、常にユーザー入力に反応するように指示するにはどうすればよいでしょうか。
答え1
この問題の解決策はまだ見つかっていませんが、他の人の興味を引くかもしれない 2 つの回避策を提案できます。
1)早起き
これはメモリ使用量を監視し、特定のしきい値に達したときにメモリを最も消費するプロセスを強制終了するサービスです(これそしてこれLinux カーネルの OOM キラーに関する質問)
私は、小さなチャンクでメモリを無期限に要求するデモ プロセスでこれをテストしました。第一印象は次のとおりです。不正なプロセスを開始すると、すぐにすべての RAM が消費されます。次にスワップが開始され、システムが応答しなくなります。数秒後、システムはオンラインに戻ります。earlyoom のログには、メモリとスワップの使用量が両方とも 90% に達した後、メモリを消費するプロセスが強制終了されたことが示されています。
スワップが開始され、プロセスが強制終了された後、他のプロセスの一部が要求されるまでスワップ内に残るという厄介な遅延がまだありますが、これは始まりです。
2) スワップを無効にする
これは物議を醸す話題しかし、デスクトップシステムや、特に開発マシンでは、プロセスがメモリを全て使い切ろうとすることが時々あるため、これは理にかなっています。スワップがなければ、OOMキラーは意図したとおりに動作します。メモリが不足すると、殺すための最良の方法そしてそれを取り除きます。遅れも遅延もありません。
現在のセッションのスワップを無効にするには、sudo swapoff -a
または変更を永続的にする。
この問題の適切な解決策は、もちろん、メイン メモリが枯渇してもシステムが応答性を維持し、明日がないかのようにメモリのスワップを開始することですが、すぐには実現しそうにありません。
答え2
+22.04 LTSから
systemd-oomd というサービスがあり、これはメモリ使用量を自動的に監視し、メモリ不足になるとプロセスを強制終了しようとします。このサービスは systemd の一部としてデフォルトでインストールされています。現在のステータスを表示するには、 と入力します。oomctl
出力例:
Dry Run: no
Swap Used Limit: 90.00%
Default Memory Pressure Limit: 60.00%
Default Memory Pressure Duration: 20s
System Context:
Memory: Used: 4.1G Total: 15.5G
Swap: Used: 1.0G Total: 3.9G
Swap Monitored CGroups:
Path: /
Swap Usage: (see System Context)
Memory Pressure Monitored CGroups:
Path: /user.slice/user-1000.slice/[email protected]
Memory Pressure Limit: 50.00%
Pressure: Avg10: 0.00 Avg60: 0.02 Avg300: 0.00 Total: 9s
Current Memory Usage: 3.9G
Memory Min: 0B
Memory Low: 0B
Pgscan: 23663084
Last Pgscan: 23663084
デフォルトでは、メモリとスワップの両方の使用率が90%になると回収を開始します。ユーザースライスコントロールグループ(つまり、[メールアドレス]) は、ほとんどのアプリケーションが起動する場所ですが、NetworkManager や Gnome Display Manager などのシステムの最も重要なコンポーネントを起動する system.slice コントロール グループには起動されません。つまり、oomd はシステム プロセスの前にユーザー プロセスを解放します。systemd-oomd の現在の構成を表示するには、次のように入力します。
systemd-analyze cat-config systemd/oomd.conf
参照するこのページ特定のsystemdユニットのOOMパラメータを編集するには、指定された変数を追加または編集します。ここユニットファイル内。
答え3
次の 2 つのいずれかを試してください。
1) swappiness設定をデフォルトの60から10に変更します。例: 追加vm.スワップの有効性 = 10/etc/sysctl.conf へ(ターミナルで と入力sudo gedit /etc/sysctl.conf
)、システムを再起動します。詳細については、こちらで swappiness を検索してください。
2) swappiness が役に立たない場合は、たとえそうしたくないとしても、スワップファイルのサイズを 1.5x16G に増やして、それが役立つかどうかを確認してください。
引き続き情報をお願いします。乾杯、アル