Linux でメモリ不足の状態でアクションをトリガーするにはどうすればよいですか?

Linux でメモリ不足の状態でアクションをトリガーするにはどうすればよいですか?

そこで、これは見つけるのがかなり簡単だと思いました。カーネルがユーザーランドのメモリが不足していることに気付いたときに、専用のメモリを持つプロセス内で何らかのアクション (プロセス リストをファイルにダンプする、ネットワーク エンドポイントに ping を実行するなど) をトリガーするサービス/カーネル モジュールです (そのため、fork() に失敗したり、その他の一般的な OOM の問題に悩まされたりすることはありません)。

私は見つけたOOMキラー、これは便利だとは思いますが、実際に必要なことは実行されません。

理想的には、メモリが不足している場合は、その理由を知りたいです。起動時に実行され、固定量のメモリを使用し、カーネルからメモリ不足の通知を受けた場合にのみ何かを実行する独自のプログラムを作成することはできると思いますが、それは別の疑問を引き起こします...

そのようなことを通知するシステムコールはあるのでしょうか? カーネルに「メモリが 128 MB しか残っていないときに起こして」と伝える方法はありますか?

ウェブやこのサイトを検索しましたが、その説明に当てはまるものは見つかりませんでした。ほとんどの人が時間遅延のポーリングを使用しているようですが、その明らかな問題は、どのプロセスが問題を引き起こしたのかを知る可能性が非常に低くなることです。

答え1

はい、Linux カーネルはこのためのメカニズムを提供しています:メモリ不足通知これは、https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt、 セクションメモリの圧力

つまり、/sys/fs/cgroup/memory/memory.pressure_level通知を受け取りたい eventfd ファイル記述子を に登録します。これらの通知はlow、 、medium、またはですcritical。一般的な使用例は、差し迫った OOM による強制終了を防ぐために、通知を受け取ったときにプロセス内の一部またはすべての内部キャッシュを解放することです。

答え2

あなたが尋ねているのは、基本的に、メモリ不足の状態でカーネルベースのコールバックのことですよね?もしそうなら、カーネルはないそのような仕組みを提供する、そしてそれには十分な理由があります。メモリが不足しているため、メモリを解放できる唯一のもの、つまり OOM キラーを直ちに実行する必要があります。その他のプログラムはマシンを停止させる可能性があります。

とにかく、ユーザー空間で簡単な監視ソリューションを実行できます。以前、私も同じような低メモリのデバッグ/アクション要件を抱えていましたが、次のような簡単な bash を作成しました。

  • 監視するソフトウォーターマーク:メモリ使用量がこのしきい値を超えると、いくつかの統計情報 (プロセス、空き/使用済みメモリなど) が収集され、警告メールが送信されます。

  • 監視するハードウォーターマーク:メモリ使用量がこのしきい値を超える場合は、統計情報を収集し、メモリを多く消費する(または重要度の低い)プロセスを終了してから、アラート メールを送信します。

このようなスクリプトは非常に軽量で、短い間隔(例:15秒)でマシンをポーリングできます。

答え3

現時点でのベストな答えはcgroups-v1です。cgroups-v2では、ファイルの変更イベントをリッスンすることができますmemory.eventsドキュメンテーションファイルの内容)。

このファイルの動作は、実際にはいくつかのシェル コマンドでテストできます。

# Spawn a new slice with memory limits to avoid OOMing the entire system
systemd-run --pty --user -p MemoryMax=1050M -p MemoryHigh=1000M bash

# Watch memory.events for changes and read when changed
inotifywait -e modify -m /sys/fs/cgroup$(cut -d: -f3 /proc/self/cgroup)/memory.events \
  | while read l; do echo $l; cat ${l// *}; done &
# Consume memory
tail /dev/zero

残念ながら、これはcgroupにメモリ制限が設定されている場合にのみ機能するようです。代わりに、記憶に耳を傾ける。圧力ただし、これは cgroup ベースではなく (少なくとも非 root ユーザーの場合)、反応もそれほど速くありません。

関連情報