Як я можу запобігти замерзанню Linux, коли немає пам'яті?


25

Сьогодні я (випадково) запустив якусь програму на своєму вікні Linux, яка швидко використала багато пам'яті. Моя система замерзла, стала не реагувати, і тому я не зміг вбити злочинця.

Як я можу запобігти цьому в майбутньому? Невже це не може тримати чуйне ядро ​​чи щось працює?


Відповіді:


15

Б'юсь об заклад, що система насправді не «замерзла» (у сенсі, що ядро ​​висіло), а навпаки, було дуже невідповідальним. Цілком ймовірно, що це було просто важко замінити, в результаті чого інтерактивна продуктивність та пропускна здатність системи впали, як камінь.

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

Крім того, ви можете використовувати обмеження ресурсів на кожен процес (зазвичай його називають rlimitта / або ulimit), щоб вилучити можливість одного процесу, який займає смішний об'єм пам'яті та спричиняє обмін, але це просто штовхає вас на розважальну територію з процесами, які вмирають на незручні моменти, тому що вони хотіли трохи більше пам’яті, ніж система їх хотіла дати.

Якби ви знали, що збираєтесь зробити щось, що може спричинити масове використання пам'яті, ви, ймовірно, можете написати програму для обгортки, яка зробила, mlockall()а потім виконала вашу оболонку; це збереже його в пам'яті, і було б найближчим чином "зберегти чуйне ядро", яке ви, швидше за все, отримаєте (адже це не те, що процесор перенасичений, це проблема).

Особисто я підписався на метод управління ресурсами "не роби дурних речей". Якщо ви отримали корінь, ви можете завдати всілякі збитки системі, і тому робити все , про що не знаєте ймовірних результатів, - це ризикована справа.


2
На жаль, "не робіть дурних речей" не допомагає користувачам, які використовують такі програми, як Chrome (див. Проблеми 134612 , 393395 ).
Дан Даскалеску

1
@DanDascalescu І не завжди очевидно, що ти робиш щось дурне. Моя машина зависла днями, тому що я змінив "UNION" у (складному) запиті SQLite на "UNION ALL".
Майкл

Відомі програми-баггі можна (і повинні) запускати в обмеженій ресурсом конфігурації - ulimitабо навіть групувати в наші дні, якщо ти молодий хіп, виконує цю роботу досить добре. Якщо ви вносите зміни до запитів у виробництві, не підтверджуючи їх ефекти в некритичному середовищі, це ваша проблема, яка є першопричиною.
жіноча

8

Як згадувалося вище в коментарі Tronic, можна викликати OOM-вбивцю (не вбивцю пам'яті) безпосередньо за допомогою комбінації клавіатур SysRq- F.

SysRqКлавіша зазвичай поєднується в межах PrtScклавіш на клавіатурах.

Убивця OOM вбиває деякий процес (-ів) і система знову стає чуйною. Прямий доступ до OOM-вбивці може бути не включений за замовчуванням, будь ласка, ознайомтеся з цим питанням, щоб дізнатися, як перевірити його стан та / або включити його.

PS: Це мені дуже допомогло. Я погоджуюся з думкою, що це найкорисніша порада щодо цієї проблеми, якщо вона викликана Chrome або будь-яким жадібним програмним забезпеченням для пам'яті. Але вам потрібно пам’ятати, що вбивця OOM може вбити якийсь справді важливий процес, використовуйте його обережно.



0

Якщо ви хочете перекомпілювати ядро, ви можете спробувати виправити патч із EDITрозділу цього питання: /programming//q/52067753/10239615
Він не виселяє Active(file)сторінки під час високого тиску пам’яті і, таким чином, це дозволяє вбивці OOM запускати майже миттєво, тому що ядро ​​більше не потрібно витрачати хвилини постійного перечитування з диска кожного виконуваного сторінки коду кожного процесу, що спричиняє застиглу операційну систему.


-1

Це щось особливо важко запобігти. Це тому, що ядро ​​починає мінятися. Одне рішення - вимкнути своп. Коли в системі не вистачить пам’яті, а не почати міняти, ядро ​​вбиває деякі процеси; зазвичай це підбирає правильний процес для вбивства, але все одно краще вбити випадковий процес, ніж мати систему, що не відповідає.

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


4
Відключення swap у будь-якій системі - погана ідея, оскільки вона не дозволяє заміняти невикористані сторінки та вільний простір, який використовується для кеш-диска. Це особливо вірно , коли є витік пам'яті.
живіт

2
І при відключенні підкачки система все одно може бути повільною через пейджинг. Це буде просто божевільно підписувати чисті сторінки замість брудних. (Оскільки без свопінгу він ніколи не може виселити брудну сторінку, її завжди доведеться виселяти з чистої.)
Девід Шварц

У мене є сервер, який має витік пам'яті. Перший раз, коли це сталося, мені довелося натиснути кнопку скидання, оскільки сервер став невідповідним. Але тепер, коли я вимкнув swap, сервер просто вбиває дитину apache, якщо вона стає занадто великою (це додаткова гарантія крім MaxRequestsPerChild). Результат - сервер працює без проблем. У ній немає багато невикористаних сторінок, і це, звичайно, не шалено читання сторінок.
Антоніс Христофідес

@AntonisChristofides: Я не впевнений, що ви вважаєте, що це урок з винесення. Ваше рішення, безумовно, погане, оскільки воно перешкоджає працездатності через неможливість вилучення з фізичної пам’яті рідко доступних брудних сторінок, це не вирішило основної проблеми, і ви ризикуєте, що вбивця OOM може вбити критичний процес. Ви не стикалися з особливою небезпекою, про яку я попереджав, але ви все ще ризикуєте цим, оскільки у вас немає заміни.
Девід Шварц

8
З заміною або без неї вона все ще застигає, перш ніж вбивця OOM автоматично запуститься. Це дійсно помилка ядра, яку слід виправити (тобто запустити вбивцю OOM раніше, перш ніж скинути кеш диска). На жаль, розробники ядра та багато інших людей не бачать проблеми. Поширені пропозиції, такі як вимкнути / включити заміну, придбати більше оперативної пам’яті, запустити менше процесів, встановити ліміти тощо, не вирішують основної проблеми, що низька обробка пам’яті ядра висмоктує кулі верблюда. Тим часом я пропоную запустити вбивцю OOM вручну (SysRq-F), коли система замерзне, оскільки це дозволить швидше відновитися.
Tronic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.