Я вважаю, що це не така рідкісна проблема: один процес виділяє величезну кількість пам’яті (будь то через помилку, що протікає в пам'яті, тому що ви намагаєтеся обробити незбагненно великий вхідний файл чи що завгодно). ОЗУ заповнюється, і в якийсь момент Linux повинен перейти на своп. Ну, іноді це лише остання можливість: якщо у мене є дорогі обчислення, я не хочу втрачати дані, якщо до кінця мені не вистачить оперативної пам'яті.
Однак, набагато частіше (на мій досвід), споживання пам’яті не обмежене, шляхом шахрайського, можливо, баггічного процесу. Тобто, я не просто закінчую, щоб деякі менш необхідні дані перенесли на своп, але ОС змушена панічно обмінюватися наборами даних. І це, на жаль, не просто сильно порушує процес правопорушення, але може привести всю систему майже в глухий кут (це вже не так вже й погано на машинах з SSD, але OTOH змушує мене хвилюватися, чи можуть записувати гігабайти і гігабайти даних про сміття в довгостроково завдають шкоди флеш-клітинкам).
Поки я не помічаю проблему і вручну забиваю процес (як тільки це насправді минуло хвилини, поки я навіть не ввійшов у віртуальний термінал!), Половина мого сеансу запущена в свопі, і мені потрібно почекати досить довго, поки система не запуститься. знову.
Існує одне драконічне рішення проблеми: примусовий жорсткий обмеження пам’яті. Але виконання цієї системи іноді вбиває процеси, які мені, швидше, ще потрібні, і якщо мені доведеться вручну ulimit
перед тим, як розпочати процес правопорушення ... ну, я часто забуду, поки не пізно.
Можливі варіанти рішення, з якими я б був щасливішим:
- Якщо будь-який процес перевищує певне використання пам’яті, він штучно знижується, тому решта системи залишається чуйною.
- Якщо будь-який процес перевищує певне використання пам’яті, це
SIGSTOP
пед, тому я маю час зрозуміти, що робити далі. - Якщо процес наближається до межі оперативної пам'яті, я отримую попередження, перш ніж розпочнеться велика заміна.
Чи є спосіб отримати таку поведінку чи подібне?
ulimit
.