メモリリークのあるプロセスを自動的に強制終了するにはどうすればよいですか?


8

メモリリークするプロセスに問題があります。これにより、私のハードドライブがのスワップファイルでいっぱいになります/private/var/vm

リークしているプロセスがOSによって一覧表示で強制終了されるようにしたいと思います。20分後に表示され、アプリケーションを強制終了するように提案し、リークしているダイアログも表示しないダイアログには興味がありません。

rssとのdata制限を設定してみ/etc/launchd.confましたが、効果がないようです。

これは私の/etc/launchd.confです:

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

ここでlaunchctl limit出力は:

% launchctl limit
    cpu         unlimited      unlimited
    filesize    unlimited      unlimited
    data        8589934592     8589934592
    stack       8388608        67104768
    core        0              unlimited
    rss         8589934592     8589934592
    memlock     unlimited      unlimited
    maxproc     709            1064
    maxfiles    256            unlimited

これは私の.zshrcです:

ulimit -t 600
ulimit -d 512000
ulimit -v 1024000

そしてulimit -a出力(ZSHで):

% ulimit -a
    -t: cpu time (seconds)         600
    -f: file size (blocks)         unlimited
    -d: data seg size (kbytes)     512000
    -s: stack size (kbytes)        8192
    -c: core file size (blocks)    0
    -v: address space (kb)         1000
    -l: locked-in-memory size (kb) unlimited
    -u: processes                  709
    -n: file descriptors           256

しかし、ここでtopプロセスについて私に語っています:

PID  COMMAND      %CPU  TIME     #TH  #WQ  #POR #MRE RPRVT  RSHRD  RSIZE  VPRVT  VSIZE  PGRP PPID
886  process      30.8  01:16.40 1/1  0    17   332  2259M+ 184K   2072M- 19G+   38G    882  885

文書化されたメモリ制限メソッドが実際に機能しないようです。私が見逃したかもしれない追加のメカニズムはありますか?


230 GiB ?! あなたが小数点を逃したことを本当に望みます。
duci9y 2013年

@ duci9yいいえ:-(
sam hocevar

3
その場合、私は誰かがあなたの問題を修正することを本当に望みます。あなたは私の祈りの中にいるでしょう。
duci9y 2013年

IRCの人々がllvm-g ++ではなくclang ++を使用する理由を教え始めたので、リークプロセスが何であったかについての言及を最終的に削除しました。
sam hocevar 2013年

火の先のとがったオブジェクト。
duci9y 2013年

回答:


3

私が定義するしきい値よりも大きい常駐メモリサイズ(または、ページアウトされたページを含む合計vmサイズ)を持つプロセスをフィルター処理する単純なスクリプトを作成します(プロセスの量、利用可能な総メモリに応じて、おそらくCPUの可用性も)。topまたはで少しbashスクリプトを使用して、psプロセスとメモリサイズのリストを掘り出すことができます。

このフィルターされたリストから、プロセスPIDごとにleaksコマンド(man 1リークを参照)を使用します。コマンドによって報告されたリークされたメモリの総量がさらに別のしきい値より高い場合は、それを強制終了して再起動します。

:何をしているかを知らずにOS /システムプロセスを強制終了しないように注意してください。この状況を回避するには、「ホワイトリスト」アプローチを使用してリストを除外する必要があります。


1

ほとんどのプラットフォームのulimitは期待どおりに機能しません。

これがデスクトップアプリでない場合は、https://github.com/arya/bluepillなどの適切なプロセススーパーバイザーで攻撃者を実行します。

これがデスクトップアプリの場合は、アプリのデベロッパーにお問い合わせください。フィードバックは必要かつ重要です。

Mac用のOOMキラーGUIのUXは恐ろしいものです。それは、各プロセスのRAM使用量の比例棒グラフで降順にソートされた最大のものでなければなりません。さらに、解決されると、一時停止されたすべてのプロセスを自動的にSIGCONTする必要があります。


1
私はいくつかのアプリケーションで問題がありましたが、ラクダの背中を壊したストローはAppleのものllvm-g++でした。問題はレーダーで報告されました。気になる:他のどのプラットフォームが機能しないのulimitですか?私はほぼ20年間、いくつかの種類のUnixを使用してきましたが、それを見た覚えはありません。
sam hocevar 2013年

-2

リブート後にこれが必要な場合は、launchctl limitコマンドのみを使用してください。

アプリケーションのメモリを制限する必要がある場合は、スタックセグメントも制限する必要があります。


出力からわかるように、スタックサイズとデータサイズの両方が制限されています。launchctl limit動作しないので質問しました。
sam hocevar 2013年

ulimitあなたが使用すること本当にあなたが必要とするように機能しませんlaunchctl limitします。
Eir Nym 2013年

そして、限界に照らされる別の瞬間:プログラムが限界に達すると、警告を受け取ります。しかし、ソフトリミットアクションはハードで実行され、成功します—失敗します。したがって、プログラムがハードリミットを超えるメモリを要求した場合、メモリは割り当てられません。
Eir Nym 2013年

launchctl limit動作しませ、または私は質問をしていません。
sam hocevar 2013年

アプリケーションのサイズをどのように測定しますか?
Eir Nym 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.