Рішення, що обмежують пам'ять, для жадібних програм, які можуть зірвати ОС?


32

Я використовую свій комп'ютер для наукового програмування. Він має здорову 8GBоперативну пам’ять та 12GBобмінний простір. Часто, оскільки мої проблеми посилюються, я перевищую всю наявну оперативну пам’ять. Замість того, щоб вийти з ладу (що було б кращим), здається, Ubuntu починає завантажувати все в своп, включаючи Unity та будь-які відкриті термінали. Якщо я не впіймаю програму, що вибігає вчасно, я нічого не можу зробити, але чекати - на перехід до командного рядка, наприклад, потрібно 4-5 хвилин. Ctrl-Alt-F2де я можу вбити злочинного процесу.

Оскільки моя власна дурість не виходить за межі цього форуму, як я можу запобігти збоїв Ubuntu через обмолот, коли я використовую всю наявну пам’ять з однієї програми-порушника?

Домашній експеримент *!

Відкрийте термінал, запустіть, pythonі якщо ви numpyвстановили, спробуйте це:

>>> import numpy
>>> [numpy.zeros((10**4, 10**4)) for _ in xrange(50)]

* Попередження: може мати несприятливі наслідки, слідкувати за процесом за допомогою iotopабо topвчасно вбивати його. Якщо ні, я побачу вас після перезавантаження.

Відповіді:


21

Вбудована оболонка ulimitдозволяє обмежувати ресурси. Для вашого випадку, щоб обмежити використання пам'яті в оболонці (та її дітей), використовуйте ulimit -v.

Демонстрація встановлення межі пам'яті 100 Мб (100000 КБ):

$ ulimit -v
unlimited
$ python -c '[ "x" * 100000000 ]'
$ ulimit -v 100000
$ python -c '[ "x" * 100000000 ]'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
MemoryError

Помічено, ps uww -C script-name-hereщо для цього python потрібно принаймні 29 МБ пам'яті (стовпець VSZ). Ліміт RSS зростає, оскільки сценарію python потрібно більше пам’яті, тому адаптуйте цей стовпець.


1
Шкода, що ми не знаємо, як виглядає власне додаток. Продемонстроване полегшення впливає на всі процеси, які є дітьми цієї оболонки. Ми навіть не знаємо, чи він працює як демон, чи є багато дітей, що ще більше ускладнить справи. Дивіться coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/…
ppetraki

1
Чи є не зручний передній кінця для всіх обмежень і контрольних груп ? У Windows, коли ОС наближається до скорочення оперативної пам’яті, попереджувальне спливаюче вікно завжди дозволяло мені уникати зависань системи. Чи потрібно в Ubuntu постійно стежити за використанням пам'яті?
Дан Даскалеску

1
@DanDascalescu Якщо у вас налаштований файл підкачки, ви матимете більші затримки, але все-таки зможете працювати. Як тільки ви помітите, що починається заміна, ви можете перевірити системний монітор на предмет використання оперативної пам'яті. Якщо у вашій системі дійсно не вистачає пам’яті, виводиться вбивця поза пам’яті (OOM), який вбиває процес з найвищим балом «поганості» (зазвичай це процес, який займає найбільше пам’яті).
Лекенштейн

12

Групи повинні дозволяти вам обмежувати використання пам’яті за кожний процес.

https://en.wikipedia.org/wiki/Cgroups

http://www.mjmwired.net/kernel/Documentation/cgroups/memory.txt

Наукові обчислення, як відомо, займають пам’ять, якщо пісочниця вашої програми в групі, інші процеси не повинні стати жертвами, оскільки тиск у пам'яті буде зменшено.

Крім того, VM може використовуватися як якийсь жорсткий ліміт, оскільки додаток може використовувати лише пам'ять, делеговану на віртуальну машину, за рахунок ефективності, звичайно. Однак VM набагато простіше налаштувати для непосвячених порівняно із створенням та підтримкою групи.

Рішення рішень :) Успіхів!


1
Чи немає зручного фронтального для ulimit і груп? У Windows, коли ОС наближається до скорочення оперативної пам’яті, попереджувальне спливаюче вікно завжди дозволяло мені уникати зависань системи. Чи потрібно в Ubuntu постійно стежити за використанням пам'яті?
Дан Даскалеску

Ні. Також ваша ОС також не повинна замерзати, це окрема проблема. Спливаючі вікна - це лише пов'язка для початку. Якщо ви використовуєте тонни пам'яті, можливо, вам слід дослідити, чому? Наприклад, сучасні браузери зі своїм санбоксингом легко споживають 70-150M PER TAB. Якщо вимкнути або налаштувати, це може звільнити значну пам’ять, яку регулярно використовує кінцевий користувач. Планувальники повинні замінювати рідко використовувані програми, щоб заощадити простір, але якщо вони прокидаються більше, ніж слід, то вам потрібно виправити їх, або якщо вашим основним завданням є об'єм пам'яті (веб), тоді потрібно більше оперативної пам'яті.
ppetraki

8
Я знаю, що споживає пам'ять - Chrome. Але ОС повинна захищати свою стабільність від програм, які все-таки працюють amok.
Дан Даскалеску

1
Я розумію, звідки ви приїжджаєте як користувач. Те, що ви просите, однак, означає перетворити загальну обчислювальну платформу в пристрій. Оскільки найменш складний (схильний до помилок) метод, який повинен застосувати інженер операційної системи, щоб забезпечити ці гарантії, - це приймати різко обґрунтовані рішення щодо того, як працює весь комп'ютер. Зазвичай це відбувається за рахунок гнучкості кінцевого користувача. Ви бачите приклади цього в планшетних обчисленнях. Однак у настільних комп'ютерах гнучкість зберігається.
ppetraki
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.