Як автоматично знищувати процеси, які втрачають пам'ять?


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 вихід (у 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

@ duci9y Nope :-(
sam hocevar

3
У цьому випадку, я дійсно сподіваюся, що хтось виправляє вашу проблему. Ви будете в моїх молитвах.
duci9y

Я зрештою усунув згадку про те, що процес протікання був, тому що люди на IRC почали читати лекції про те, чому я повинен використовувати clang ++ замість llvm-g ++, і це тільки змушує мене хотіти вдарити їх з гострими об'єктами.
sam hocevar

Гострі об'єкти у вогні.
duci9y

Відповіді:


3

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

З цього відфільтрованого списку, я б використав leaks (див людина 1 витоку ) на PID процесу. Якщо загальна кількість пропущеної пам'яті, повідомленої командою, перевищує ще один поріг, я б тоді вбив і відродив її.

ПРИМІТКА : Необхідно дбати про те, щоб не вбивати процеси ОС / системи, не знаючи, що ви робите. Щоб уникнути цієї ситуації, можливо, слід відфільтрувати список за допомогою підходу "білий список".


1

ulimit на більшості платформ не працює належним чином.

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

Якщо це настільна програма, зв’яжіться з розробниками програми. Зворотній зв'язок необхідний і важливий.

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


1
У мене були проблеми з декількома додатками, але соломою, що розбила верблюда назад, була компанія Apple llvm-g++. Про проблему повідомлялося в радарі. Мені цікаво: яка інша платформа не працює ulimit? Я використовую декілька смаків Unix протягом майже 20 років, і я не пам'ятаю, бачив один.
sam hocevar

-2

Якщо вам це потрібно через перезавантаження, ви повинні використовувати тільки launchctl limit команду.

Якщо вам потрібно обмежити пам'ять програми, вам також слід обмежити сегмент стека.


Як ви можете бачити на виході, розмір і розмір стека обмежені. Я запитав це питання, тому що launchctl limit робить ні роботи.
sam hocevar

ulimit Ви використовуєте дійсно не працює як вам потрібно. launchctl limit робить.
Eir Nym

і ще один момент, який треба запалити в межі: коли програма досягає меж, вона отримує попередження. але з м'яким обмеженням дія буде виконуватися в успіх, з жорстким - це буде не вдалося. Тому, якщо програма запитує пам'ять за межі жорсткого ліміту, пам'ять не буде виділено.
Eir Nym

launchctl limit робить ні працювати, або я не ставлю питання.
sam hocevar

як виміряти розмір програми?
Eir Nym
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.