だから私はこれが非常に簡単な修正になると思いました。カーネルがユーザー領域にメモリが不足していることを知っているときにいくつかのタスクをトリガーするサービス/カーネルモジュール。 ))独自のプライベートメモリを持つプロセスで(したがってfork()が失敗したり、他の一般的なOOMの問題は発生しません)。
見つけました。OOMキラー、これは役に立つことを知っていますが、実際に必要なことをしません。
理想的には、メモリが不足している場合はその理由を知りたいです。起動時に実行され、固定量のメモリを使用し、カーネルからメモリ不足の通知を受け取った場合にのみタスクを実行する独自のプログラムを作成できるとします。しかし、そうすると、それ自体が問題を引き起こす可能性があります。
同様のことを知らせるシステムコールはありますか?カーネルに「メモリが128MBしか残っていない場合は目を覚ます」と言う方法は?
オンラインとここで検索しましたが、その説明に合ったものが見つかりませんでした。ほとんどの人が時間遅延にポーリングを使用しているように見えますが、明らかな問題は、どのプロセスが問題を引き起こしているのかを知る可能性が低いことです。
答え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ではないユーザーの場合)、反応が悪いです。