Чи можливо змусити вбивцю ООМ втручатися раніше?


34

Я намагаюся налаштувати свою систему розвитку на максимальну надійність. Я відключив своп, оскільки для використання графічного інтерфейсу він здебільшого робить машину невідповідною таким чином, що більше не використовується. Тим не менш, якщо агресивні програми з’їдають пам’ять, деякі механізми, здається, вдаряють у тому, щоб максимально використати її за рахунок швидкості. Не існує жодної операції заміни жорсткого диска, але система також не реагує. Тож я хочу дозволити вбивці OOM вбитись до того, як система докладе особливих зусиль щодо збільшення пам'яті. Чи можна налаштувати вбивцю OOM для дії, якщо, наприклад, менше 100 Мб вільної фізичної пам'яті?


2
Я думаю, що справжнє питання тут полягає в тому, що для цього недостатньо барана. Ви не будете використовувати своп, якщо немає барана. Якщо вимкнути своп ... у вас закінчився оперативний танець і не маєте де його переглядати. Що спричиняє потворні речі. Здається, ваша система налаштована погано, і жодна кількість налаштувань цього не виправить.
Подорожник Geek

8
Я не згоден. Розвиток та "використання енергії" часто передбачає експериментальне використання. Наприклад, при використанні інструменту обробки зображень командного рядка немає специфікацій, скільки пам’яті займає операція щодо розміру зображення. Тож я просто даю йому побігти. І я не очікую, що це зробить всю мою машину марною. Для одного експерименту я міг би використовувати ulimit, щоб забезпечити його захищеним, але для роботи всієї системи, де іноді багато операцій, стримування одного процесу не є настільки корисним, але, безумовно, є «страхуванням життя» для всієї машини.
дрон

1
Підозрюється той факт, що ваша система зупиняється при використанні swap. Комп'ютер, що використовує своп, викликає його пам'ять. Зміна сповільнюється, оскільки доступ до диска повільний. Доступ до дисків повільний через ???. Її проблеми аж донизу. Справа не тільки в тому, що ти мало баран. Це означає, що ви не можете використовувати один спосіб пом'якшити це через щось інше.
Подорожник Geek

7
@JourneymanGeek, ти пішов у лівому полі. Диски повільні в порівнянні з таранними, періодичними, тому велика заміна завжди перериває систему. Звичайно, йому не вистачає пам’яті, оскільки він спробував запустити програму, яка використовує багато пам’яті. Питання в тому, що робити, коли немає пам’яті? Вбийте свиню або сповільнюйте через те, що у кеш диска не залишилося пам'яті.
psusi

2
@TomWijsman, Disk IO на багато порядків повільніше, ніж IO пам'яті, тому використання дискового підкачки завжди означало величезне сповільнення. Іноді (особливо в старі часи, коли таран був дорогим, і тому у більшості людей не було багато), це краще, ніж взагалі не можна робити те, що ти намагався. У ці дні диска SO набагато повільніше , ніж баран, і баран досить дешевий , що у більшості людей є багато, так що в тих рідкісних випадках , коли вони випадково запустити що - то , що використовує більше оперативну пам'ять , ніж вони є, часто краще відмовитися , ніж взяти тисячі разів, поки це зробити.
psusi

Відповіді:


36

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

Однак у користувальницькому просторі ми можемо робити все, що завгодно. Тож я написав Daemon Early OOM ( https://github.com/rfjakob/earlyoom ), який знищить найбільший процес (за RSS), коли наявна оперативна пам'ять опуститься нижче 10%.

Без раннього зусилля, було легко зафіксувати мою машину (8 ГБ оперативної пам’яті), запустивши http://www.unrealengine.com/html5/ кілька разів. Тепер винні вкладки браузера вбиваються, перш ніж речі вийдуть з-під руки.


3
Дякуємо, що почухали цей свербіж! Поки що люблять рано
Томас Ферріс Ніколайзен

1
Щойно з’ясував, що Android робить те саме давно. Я не впевнений, чи для цього використовується спеціальний код, як ваш.
дрона

1
earlyoomЗараз я тестую , це добре справляється під час першого тесту тригера. Мені просто цікаво, чому це неможливо реалізувати за допомогою конфігурації ядра чи системних інструментів.
дрон

12

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

Ви можете змінити політику за замовчуванням, щоб заборонити перезавантажувати пам'ять, записавши значення 2 до /proc/sys/vm/overcommit_memory. Значення за замовчуванням /proc/sys/vm/overcommit_ratio- 50, тому ядро ​​не дозволить програмам виділяти більше 50% ram + swap. Якщо у вас немає swap, ядро ​​не дозволить програмам виділяти більше 50% вашого оперативної пам’яті, залишаючи інші 50% вільними для кешу. Це може бути трохи надмірним, тому ви, можливо, захочете збільшити це значення, скажімо, на 85% або близько того, тому програми можуть виділити до 85% вашого барана, залишаючи 15% для кешу.


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

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

Який рядок у питанні дає це зрозуміти? Я бачу протилежне, наведене в I disabled swap, because for GUI usage it mostly renders the machine unresponsive in such a way not useable anymore.. Він згадав GUI, поки ви припускаєте, що він виконує команду. Придбання більшої кількості пам’яті - це перше рішення, а використання меншої кількості пам’яті - це друге рішення, що робить вашу систему нестабільною, погоджуючись зі стабільними за замовчуванням - останнім рішенням. На це питання не слід відповідати буквально, тому я не бачу, у чому ваша проблема, що вам доведеться турбувати нас обох у коментарях. Рант не допомагає ...
Тамара Війсман

4
Гей, ця відповідь звучала досить класно. На жаль, "фіксація" відноситься до попиту на віртуальну пам'ять, що, здається, дуже погано оцінюють програми програми. Наприклад, з моїм робочим столом (без заміни) працює близько 400 з 2000 Мб фізичної пам’яті, яка використовується, але 1600 Мб 'зафіксовано як стан /proc/meminfo' Committed_AS. У деяких запущених додатках ця величина легко перевищує фізичну пам'ять, тому важко встановити можливу межу цим.
дрон

3
Збережіть свою роботу, перш ніж спробувати це! : У ПІ були негайні збої з усього (баш, менеджер вікон тощо).
jozxyqk

8

Для мене налаштування vm.admin_reserve_kbytes = 262144 робить саме це. Вбивця OOM втручається до того, як система повністю не реагує.


1
Мені подобається ідея, але чи означає це, що ти ніколи не використовував 256 Мбіт фізичної пам'яті?
Jérôme Pouiller

1
256MiB буде використовуватися для кеш-пам'яті. Кеші дійсно важливі, справа не в тому, щоб просто працювати швидше, система взагалі не працювала б, якщо не вистачає пам'яті для кеш-пам'яті. Код кожної запущеної програми можна вивантажити з пам'яті, оскільки вона складена з карти та може бути прочитана назад з диска. Без кешів кожен перемикач завдань вимагатиме зчитування диска, і система стане абсолютно невідповідною.
Михайло Виговський

4

Інші відповіді мають хороші автоматичні рішення, але я вважаю, що це може бути корисно також включити SysRqключ, коли речі виходять з рук. За допомогою SysRqключа ви будете обробляти ядро ​​вручну, і ви можете робити такі речі, як безпечна перезавантаження (з SysRQ + REISUB), навіть якщо користувацька область повністю застигла.

Щоб дозволити ядро ​​прослуховувати запити, встановити kernel.sysrq = 1або включити лише ті функції, які ви, ймовірно, використовуєте за допомогою бітової маски ( тут задокументовано ). Наприклад kernel.sysrq = 244, увімкніть усі комбінації, необхідні для безпечної перезавантаження вище, а також ручне виклик вбивці OOM за допомогою SysRq + F.


-2

Надійність не досягається низькими умовами пам’яті та вбивцею OOM.

Неправильно організовувати вечірку в шафі та розміщувати "прибирання моєї шафи" у вашому невеликому списку відтворення.

Чи можливо змусити вбивцю ООМ втручатися раніше?

Це призведе до небажаних побічних результатів, оскільки ви не маєте контролю над тим, що вбито.

Я намагаюся налаштувати свою систему розвитку на максимальну надійність.

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

Просто налаштування випадкових речей нікуди не дінеться ...

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

Через низькі умови пам'яті, відключення swap не покращить поведінку , це робить навпаки .

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

Не існує жодної операції заміни жорсткого диска, але система також не реагує.

Низькі умови пам’яті дійсно призводять до безвідповідальності, незалежно від того, маєте ви своп або ні.

Тож я хочу дозволити вбивці OOM вбитись до того, як система докладе особливих зусиль щодо збільшення пам'яті.

Особливі зусилля, які принесуть більше шкоди, ніж користі, як я пояснив вище. Натомість ви можете вбити процеси, які вам самі не потрібні, але, мабуть, ви не можете цього зробити, щоб OOM знищив потрібні вам процеси.

Чи можна налаштувати вбивцю OOM для дії, якщо, наприклад, менше 100 Мб вільної фізичної пам'яті?

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


7
Звичайно, відключення swap покращує поведінку, тому що замість того, щоб розтрощити диск, OOM запускає і вбиває свиню пам’яті. Вибіг барана не є проблемою (а додавання більше означає, що вам доведеться постаратися більше). Проблема полягає в тому, що робити, коли у вас НЕ закінчуються. Ви хочете, щоб OOM вбив свиню і тим самим полегшив стан пам'яті.
psusi

7
Тому що вбивати додаток, який намагається використовувати більше пам’яті, ніж у вас є, переважніше, ніж підвести всю систему на коліна. У ідеальному світі ви мали б необмежену пам’ять і ніколи не закінчилися, але насправді іноді ви закінчуєтесь випадково, і, швидше, вам скажуть «недостатньо пам’яті», ніж змушують систему зупинитися.
psusi

5
Купівля додаткової пам’яті може вирішити деякі проблеми, залежно від придбаної суми. Але це не змінює того факту, що можуть бути несподівані звичаї за порядком. Тому я хочу, щоб програма не вийшла з ладу, але НЕ система за тих умов. Деякі приклади: обробляйте папку, наповнену стислими зображеннями, більшість з яких "нормального" розміру, але деякі з них дійсно великі. Невелика помилка могла б зробити мертву петлю, коли пам’ять втікає 1 Гб / с. Випадково відкрийте відеофайл у текстовому редакторі. Зазвичай це закінчується такими симптомами, як ривка миші та майже мертвий інтерфейс користувача, поки не починає OOM.
dronus

6
@TomWijsman також є майже мертві петлі, оскільки є алгоритми, які ведуть себе лінійно в середньому випадку, але експоненціальні в гіршому випадку, залежно від вхідних даних. І я не можу надіслати сигнал вбивства, якщо миша ривком і клацанням, а також введення клавіатури показує затримку на одну хвилину. Зазвичай я переходжу до терміналу текстового режиму, і тоді чекаю хвилин, щоб вхід увійшов просто для видачі killсліпо введеного.
дрон

7
У мене немає проблем із вбивством додатків, які також загинули б. Розглянемо систему з фізичним обміном 2 Гб + 2 ГБ. Додаток, у якого швидко вичерпується фізична пам'ять, також може легко з'їсти своп. Він просто загине пізніше, відмовивши систему відреагувати хвилин на години. То чому б не вбити його швидко, перш ніж операція GUI не стане влучною? Багато процесів виконують всю свою роботу з 10 Мб, деякі беруть 1 Гб, а деякі рідкісні знадобляться 10 ГБ, це життя.
дрон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.