Как мне автоматически убить процессы, которые пропускают память?

8

У меня проблемы с процессами с утечкой памяти. Они заставляют мой жесткий диск заполняться файлами подкачки /private/var/vm.

Я хотел бы, чтобы протекающие процессы были убиты операционной системой . Меня не интересует диалоговое окно, которое появляется через 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вывод (в ЗШ):

% 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 ГиБ ?! Я действительно надеюсь, что вы пропустили десятичную точку.
duci9y
@ duci9y Нет :-(
Сэм Хоцевар
3
В таком случае, я действительно надеюсь, что кто-то решит вашу проблему. Вы будете в моих молитвах.
duci9y
В конце концов я удалил упоминание о том, что происходило в результате утечки, потому что люди в IRC начали читать мне лекции о том, почему я должен использовать clang ++ вместо llvm-g ++, и это только заставляет меня хотеть поражать их острыми объектами.
Сэм Хоцевар
Острые предметы в огне.
duci9y

Ответы:

3

Я бы создал простой сценарий, который бы фильтровал процесс любого процесса с резидентным размером памяти (или, возможно, общим размером виртуальной машины, включая все страницы с выгруженными страницами) больше порогового значения, которое я определяю (в зависимости от объема процесса, общего объема доступной памяти и возможно также доступность процессора). Можно использовать немного bash-скрипта с topили, psчтобы выкопать список процессов и объем памяти.

Из этого отфильтрованного списка я бы использовал leaksкоманду (см. Man 1 leaks ) для PID процесса. Если общий объем утечки памяти, о которой сообщает команда, выше, чем еще один порог, я бы затем убил и возродил его.

ПРИМЕЧАНИЕ . Вам следует позаботиться о том, чтобы не завершать процессы ОС / системы, не зная, что вы делаете. Чтобы избежать этой ситуации, вам, возможно, следует отфильтровать список, используя подход «белого списка».

Гюйгенс
источник
1

ulimit на большинстве платформ работает не так, как ожидалось.

Если это не настольное приложение, запустите нарушителя с соответствующим руководителем процесса, таким как https://github.com/arya/bluepill

Если это настольное приложение, свяжитесь с разработчиками приложения. Обратная связь необходима и важна.

UX в графическом интерфейсе OOM killer для Mac ужасен. Это должно быть наибольшее отсортированное по убыванию пропорциональное гистограмму для использования оперативной памяти каждого процесса. Кроме того, он должен автоматически SIGCONT все приостановленные процессы при разрешении.

dhchdhd
источник
1
У меня была проблема с несколькими приложениями, но соломинка, которая сломала спину верблюду, была у Apple llvm-g++. О проблеме сообщили в радаре. Мне любопытно: какая еще платформа имеет нерабочую ulimit? Я использую несколько разновидностей Unix в течение почти 20 лет, и я не помню, чтобы увидеть один.
Сам Hocevar
-2

Если вам это нужно при перезагрузке, вы должны использовать только launchctl limitкоманду.

Если вам нужно ограничить память приложения, вы также должны ограничить сегмент стека.

Эйр Ним
источник
Как видно из вывода, размер стека и размер данных ограничены. Я задал вопрос, потому launchctl limitчто не работает.
Сэм Хоцевар
ulimitвы используете действительно не работает, как вам нужно. launchctl limitделает.
Эйр Ним
и еще один момент, который будет освещен в пределах: когда программа достигает пределов, она получает предупреждение. но с мягким ограничением действие будет выполнено успешно, с трудным - оно не удастся. Поэтому, если программа запрашивает память сверх жесткого предела, память не будет выделена.
Эйр Ним
launchctl limitэто не работает, или я бы не задать вопрос.
Сам Хоцевар
как вы измеряете размер приложения?
Eir Nym