Запобігайте замерзанню Ubuntu, навіть якщо системна пам’ять мало


24

Іноді я працюю з величезними скидами даних, які хочу зберегти в пам'яті для обробки. Іноді я неправильно підрахував об’єм пам’яті, яку виробить моя програма, або відладчик множить використання пам’яті на коефіцієнт, що перевищує мою наявну пам’ять.

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

Ось що для мене робить Ubuntu: з’їжте всю вільну пам’ять, потім попросіть операційну систему поміняти всі основні сервіси (сеанс gnome, термінал, клавіатура), а потім замерзнути і чекати, коли я вийме шнур живлення.

Два питання:

  1. Як операційна система може припустити, що що-небудь може бути настільки важливим, щоб нормально перестати слухати введення користувачів?
  2. Як я можу сказати Ubuntu ніколи не обмінюватись важливими послугами та завжди реагувати на введення користувачів, навіть якщо якийсь дурний процес намагається з'їсти більше ресурсів, ніж надає система.

Скільки оперативної пам’яті ви встановили? Якого розміру ваш своп (у терміналі, введіть, swaponщоб дізнатися)? Ура, Аль
хейннема

3
16 Гб оперативної пам’яті та 16Gb своп. Але це не в цьому суть, цю проблему неможливо вирішити, додавши більше пам’яті.
Кламан

1
Спробуйте одну з двох речей. 1) змінити swappinessналаштування на 10, тобто: vm.swappiness = 10в /etc/sysctl.conf. Шукайте тут свобідність для отримання додаткової інформації про нього. 2) Якщо заміщення не допомагає ... Хоча ви, можливо, не хочете ... збільште розмір свого swapfile до 1,5x16G і подивіться, чи це допомагає. Тримай мене в курсі. Ура, Al
heynnema

1
@Klamann Я погоджуюся, що додавання більше свопів не вирішить проблему. Після того, як у вас є зламана програма, що споживає всю оперативну пам'ять + SWAP, додавання додаткового SWAP лише затримує неминуче.
WinEunuuchs2Unix

1
@ WinEunuuchs2Unix, як я вже сказав, vm.swappiness=10має бути додано до sysctl.conf. Досвідчена людина може навіть використовувати команду sysctl на льоту, щоб встановити vm.swappiness = 10, не редагуючи файл sysctl.conf. Ура, Аль пс: чекаю, коли ОП відповість.
heynnema

Відповіді:


5

У мене поки що немає рішення проблеми, але я можу запропонувати два обхідні шляхи, які можуть зацікавити інших:

1) ранній зум

Це сервіс, який спостерігає за використанням пам'яті та вбиває процес, який споживає найбільше пам’яті, коли досягнутий певний поріг (див. Також це та це питання щодо вбивці OOM у ядрі Linux)

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

Досі існує роздратований відставання, коли заміна починається і після того, як процес був убитий, деякі частини інших процесів зазвичай залишаються в свопі, поки їх не вимагають, але це початок.

2) просто відключити своп

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

Ви можете відключити своп для поточного сеансу sudo swapoff -aабо зробити зміни постійними .


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


1
У мене відключений своп, і моя система переходить прямо від низької пам'яті (<100 МБ) до заморожування. Як я можу визначити, чи вбивця OOM ввімкнено?
Майкл

0

Спробуйте одне з двох:

1) змінити налаштування swappiness з його за замовчуванням 60, на 10, тобто: додати vm.swappiness = 10 в /etc/sysctl.conf (у терміналі, тип sudo gedit /etc/sysctl.conf), а потім перезавантажити систему. Шукайте тут свобідність для отримання додаткової інформації про нього.

2) Якщо заміщення не допомагає ... навіть якщо ви не хочете ... збільште розмір свого swapfile до 1,5x16G і подивіться, чи це допомагає.

Тримай мене в курсі. Ура, Ал


Я встановив VM для запуску деяких тестів, тому що перезавантаження моєї ОС кожні кілька секунд насправді дратувало. Ubuntu 16.04, 2 Гб оперативної пам’яті, 3gb своп, 20 Гбіт диск. Тоді я запустив сценарій, який з’їдає багато пам’яті: при заміні за замовчуванням (60) система замерзає і через кілька хвилин я вимкнув її, оскільки час на відновлення був неприйнятний. З заміщенням 10 система замерзає на кілька секунд, після чого приймає введення, але ви не можете запускати жодних процесів (наприклад, topвбити свиню пам'яті). Через хвилину або близько того процес вбивається. Не ідеально, але ми все ближче.
Кламан

Повідомте нас. Віртуальний комп'ютер по-справжньому не буде імітувати вашу реальну операційну ОС, але він дозволить вам грати з налаштуваннями. Мені буде цікаво, якщо замість допоможе у вирішенні вашої проблеми. Ура, Аль
хейннема,

Ах, добре. Прогрес! Почитайте трохи про заміщення. Ви можете трохи пограти зі значенням. Ура, Аль
хейннема

Скільки swap було використано, коли система замерзла? Ура, Аль
хейннема

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

0

Я вирішив подібну проблему. Я не знаю, чи мій досвід для вас підходить ...

Нещодавно я опублікував посібник про те, як встановити Linux на loopback LVM-пристрої, що завантажуються з USB (так що без необхідності встановлювати grub на внутрішній диск, залишаючи його як оригінальний). Ось посібник: https://github.com/DareDevil73/linux-on-loopback-usb .

Тоді я потрапив у проблему заморожування при високому завантаженні пам'яті, і я спостерігав ненормальне використання місця підкачки (вся з'їдена оперативна пам’ять та використання свопів майже до нуля). Очевидно LVM-розділ swap був змонтований і працює належним чином, але я не знаю, чому ядро ​​не використовувало його, як очікувалося.

Я спробував альтернативне рішення. Я створив файл циклу swap (не LVM), і заморожування вже не відбувається. Тепер файл swap використовується як було б, і ОС ніколи не зависає!

Щоб отримати більш детальну інформацію, перегляньте https://github.com/DareDevil73/linux-on-loopback-usb#known-isissue .


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