Чи можливо накласти якусь м'яку межу на споживання пам'яті процесів?


10

Я вважаю, що це не така рідкісна проблема: один процес виділяє величезну кількість пам’яті (будь то через помилку, що протікає в пам'яті, тому що ви намагаєтеся обробити незбагненно великий вхідний файл чи що завгодно). ОЗУ заповнюється, і в якийсь момент Linux повинен перейти на своп. Ну, іноді це лише остання можливість: якщо у мене є дорогі обчислення, я не хочу втрачати дані, якщо до кінця мені не вистачить оперативної пам'яті.

Однак, набагато частіше (на мій досвід), споживання пам’яті не обмежене, шляхом шахрайського, можливо, баггічного процесу. Тобто, я не просто закінчую, щоб деякі менш необхідні дані перенесли на своп, але ОС змушена панічно обмінюватися наборами даних. І це, на жаль, не просто сильно порушує процес правопорушення, але може привести всю систему майже в глухий кут (це вже не так вже й погано на машинах з SSD, але OTOH змушує мене хвилюватися, чи можуть записувати гігабайти і гігабайти даних про сміття в довгостроково завдають шкоди флеш-клітинкам).
Поки я не помічаю проблему і вручну забиваю процес (як тільки це насправді минуло хвилини, поки я навіть не ввійшов у віртуальний термінал!), Половина мого сеансу запущена в свопі, і мені потрібно почекати досить довго, поки система не запуститься. знову.

Існує одне драконічне рішення проблеми: примусовий жорсткий обмеження пам’яті. Але виконання цієї системи іноді вбиває процеси, які мені, швидше, ще потрібні, і якщо мені доведеться вручну ulimitперед тим, як розпочати процес правопорушення ... ну, я часто забуду, поки не пізно.

Можливі варіанти рішення, з якими я б був щасливішим:

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

Чи є спосіб отримати таку поведінку чи подібне?


2
Ви можете обмежити кількість оперативної пам’яті, що використовується процесом або групою процесів, використовуючи групи. stackoverflow.com/questions/3043709 / ...
Відзначити Тесляр

2
Це буквально точна річ ulimit.
DopeGhoti

1
Ulimit -m було б чим користуватися, за винятком того, що він не працював на Linux з 2.4.30, і працював лише в певних ситуаціях до цього. unix.stackexchange.com/questions/129587/…
Марк Плотник

niceload - swap yourprg
Ole Tange

Відповіді:


6

niceload - swap yourprg зроблений саме для такої ситуації: Він дивиться на активність обміну:

  • Якщо заміна: Нехай процес запускається
  • Якщо заміна: Нехай процес запускається
  • Якщо заміна та вимикання: Призупиняйте процес, поки заміна не припиниться, і відновіть процес, коли заміна припиниться

Це не призупиняє процес до початку заміни, але дозволяє заміну працювати протягом 1 секунди перед дією.

niceload --mem 1G yourprgпрацює аналогічно: Якщо менше ніж 1 Гб, безкоштовна версія вашогоprg призупинена. Коли більше 1 Гб безкоштовно, вашprg поновлюється.


0

Так. Це досить легко зробити практично з будь-якою сучасною оболонкою.

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

Ви можете використовувати -lопцію для обмежених обмежень пам'яті. Якщо буде перевищено ліміт, ваш процес буде сигналізований.


-1

Cronjob для очищення кешу: Як очистити кеш пам'яті в Linux

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

Простий і ледачий.


Гм. Цікава пропозиція, хоча я боюся, що вона не робить нічого для більшості проблем, які я відчуваю. Моє головне питання - це єдині процеси (наукові програми), які можуть швидко виділити багато гігабайт пам'яті.
приблизно

Очищення кешів зазвичай спричиняє проблеми з продуктивністю. Дуже періодично вони вирішують проблеми з продуктивністю. Але вони не стануть доступними для пам'яті, коли її немає.
Жил 'SO- перестань бути злим'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.