だから、これは見つけるのがかなり簡単なことだと思いました:サービス/カーネルモジュールは、カーネルがユーザーランドメモリが不足していることに気づくと、何らかのアクションをトリガーします(たとえば、プロセスリストをファイルにダンプし、ネットワークエンドポイントにpingを送信します) )独自の専用メモリを持つプロセス内(したがって、fork()に失敗したり、他の通常のOOM問題の影響を受けたりすることはありません)。
私は OOM killer を見つけました。これは便利だと理解していますが、必要なことを実際には実行していません。
理想的には、メモリが不足している場合は、その理由を知りたいです。起動時に実行され、一定量のメモリを使用する独自のプログラムを作成し、カーネルによってメモリ不足が通知されたときにのみ処理を行うことができると思いますが、それは独自の質問を引き起こします...
そのような何かを知らされるsyscallさえありますか?カーネルへの言い方は、「メモリが128 MBしか残っていないときに起こして」
私はウェブの周りとここで検索しましたが、その説明に合うものは何も見つかりませんでした。ほとんどの人は時間遅延でポーリングを使用しているようですが、それに関する明らかな問題は、どのプロセスが問題の原因であるかを知ることができる可能性が低くなることです。
あなたが求めているのは、基本的に、メモリ不足の状態でのカーネルベースのコールバックですよね?もしそうなら、私はカーネルがnotがそのようなメカニズムを提供することを強く信じていますそして十分な理由で:メモリが少ない場合、それはすぐに解放できる唯一のものを実行するべきですいくつかのメモリ-OOMキラー。他のプログラムは、マシンを停止させる可能性があります。
とにかく、ユーザー空間で簡単な監視ソリューションを実行できます。過去にも同じ低メモリデバッグ/アクション要件があり、次のような簡単なbashを作成しました。
ソフトウォーターマークを監視します:メモリ使用量がこのしきい値を超えている場合は、いくつかの統計(プロセス、空きメモリ/使用済みメモリなど)を収集し、警告メールを送信します;
ハードウォーターマークを監視します:メモリ使用量がこのしきい値を超えている場合は、いくつかの統計を収集し、より多くのメモリを必要とする(またはそれほど重要ではない)プロセスを強制終了してから送信しますアラートメール。
このようなスクリプトは非常に軽量で、短い間隔(つまり、15秒)でマシンをポーリングできます。
はい、Linuxカーネルはこのためのメカニズムを提供しています:メモリ圧力通知。これは https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt 、セクションMemory Pressureに記載されています。
つまり、通知を受け取りたい/sys/fs/cgroup/memory/memory.pressure_level
にeventfdファイル記述子を登録します。これらの通知は、low
、medium
、またはcritical
です。典型的な使用例は、差し迫ったOOMの強制終了を防ぐために、通知を受け取ったときにプロセスの一部またはすべての内部キャッシュを解放することです。