У Ubuntu швидко закінчується оперативна пам’ять, і мій комп'ютер починає мерзнути. Яка команда вирішить це?


73

Зі мною трапляється досить часто, коли я збираю програмне забезпечення у фоновому режимі, і раптом все починає сповільнюватись і врешті-решт замерзає [якщо я нічого не роблю], оскільки у мене закінчилося як оперативна пам’ять, так і обмінний простір.

Це запитання передбачає, що у мене є достатньо часу та ресурсів для відкриття терміналу Gnome, пошуку моєї історії та виконання однієї sudoкоманди.

Яка команда може врятувати мене від необхідності робити важку перезавантаження чи взагалі будь-яку перезавантаження?


Коментарі не для розширеного обговорення; ця розмова перенесена в чат .
Thomas Ward

1
Якщо у вас не вистачає місця для заміни, я думаю, у вас це занадто мало. На цьому комп’ютері я отримав 20 Гб місця для обміну. Сенс у тому, щоб ви приділили вам достатньо часу із зручною системою, щоб знищити все, що з'їдає вашу пам’ять. Це не те, де ви берете лише те, що будете використовувати, але те, що, сподіваєтесь, ніколи не використаєте.
JoL

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

3
Спробуйте зменшити кількість своїх паралельних збірок, якщо у вас недостатньо оперативної пам’яті для її підтримки. Якщо ваша збірка почне мінятися, ви будете набагато повільнішими. З make, спробуйте -j4, наприклад , для 4 паралельно будує одночасно.
Шахбаз

1
"Alexa замовляє мені 8

Відповіді:


84

З мого досвіду Firefox та Chrome використовують більше оперативної пам’яті, ніж мої перші 7 комп’ютерів разом. Можливо, більше того, але я відходжу від своєї точки зору. Найперше, що вам слід зробити, це закрити веб-переглядач . Команда?

killall -9 firefox google-chrome google-chrome-stable chromium-browser

Я зв'язав найпопулярніші веб-переглядачі разом в одну команду, але очевидно, якщо ви запускаєте щось інше (або знаєте, що не використовуєте одну з них), просто змініть команду. killall -9 ...Це важливий біт. Людям все-таки цікаво SIGKILL(сигнал № 9), але браузери надзвичайно стійкі. Більше того, повільно закінчившись SIGTERM, означає, що веб-переглядач набирає сміття з очищення - для чого потрібен приплив додаткової оперативної пам’яті - і це те, що ви не можете собі дозволити в цій ситуації.

Якщо ви не можете ввімкнути це у вже запущений термінал або діалог Alt+ F2, подумайте про перехід на TTY. Control+ Alt+ F2переведе вас до TTY2, який повинен дозволяти вам увійти (хоча це може бути повільно) і навіть дозволить вам використовувати щось на кшталт htopналагодження проблеми. Я не думаю, що я ніколи не закінчувався оперативною пам’яттю, до якої я не міг встати htop.

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


Коментарі не для розширеного обговорення; ця розмова перенесена в чат .
Thomas Ward

У мене є кілька команд, пов’язаних із моєю власною lazygitкомандою, яку я час від часу використовую, можливо, щось подібне можна застосувати тут? Весь killall ...сценарій може бути зведений до простого emptyramчи чогось подібного
Francisco Presencia

Вам не потрібно запускати повну команду, якщо ви знаєте, який браузер працює, і я вважаю, що це робить більшість людей, які можуть виявити дефіцит оперативної пам'яті. На розширення, мені буде важче згадати, що я написав emptyramсценарій, ніж просто пробивати killall -9 firefox.
Олі

2
Покупка оперативної пам’яті… чому б просто не завантажити більше оперативної пам’яті?
Стефан Біцзіттер

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

66

У системі з увімкненою клавішею Magic System Request натискання Alt + System Request+ f(якщо це не позначено на клавіатурі, System Requestчасто є Print Screenклавішею), вручну викликає ядро ​​з вбивці пам'яті (oomkiller), яке намагається вибрати найгірший процес образи для використання пам'яті та вбийте її. Ви можете це зробити, якщо у вас, можливо, менше часу, ніж ви описали, і система ось-ось почне (або, можливо, вже почалася) молоть - в такому випадку вам, мабуть, все одно, що саме загине, тільки що ви закінчите з придатною системою. Іноді це може закінчитися вбивством X, але більшість часу в ці дні набагато краще вибирати поганий процес, ніж це було раніше.


5
@ T.Sar, якщо ви збираєтеся прямо заграти, ви вже або втратите, або отримаєте шанс вбити мелодія. Ви нічого не отримуєте, якщо просто утримаєтесь від дії.
Руслан

4
@Muzer це буде працювати тільки тоді , коли ви встановили , kernel.sysrqщоб 1або номер , включаючи правильний біт в вашому /etc/sysctl.d/10-magic-sysrq.conf.
Руслан

9
@ T.Sar Ви не збираєтеся втрачати свій прогрес, якщо використовуєте здорову систему складання. Ви збережете всі об’єктні файли, окрім файлу, який ви фактично компілювали, тоді ви повернетесь до місця, де ви зупинилися.
Мюзер

3
@ T.Sar Тільки тому, що те, що ви збираєте, не є здоровим, не означає, що система збірки не є нормальною. Системи побудови з незапам’ятних часів зберігають файли об’єктів для повторного використання в наступних компіляціях. З іншого боку, я, безумовно, можу назвати безліч програмних проектів з меншою розумністю, ніж Linux (який, як правило, досить добре розроблений). Наприклад, компілюючи щось на зразок Firefox або OpenOffice з 8 паралельних ниток збірки, я можу легко бачити це в порядку гігабайт оперативної пам’яті. Існує також безліч монолітних корпоративних систем, які залежать від сотень бібліотек.
Мюзер

7
@ T.Sar Linux насправді не складний з POV компілятора. Насправді майже немає програм C, які є. Що з C ++? Ви коли-небудь намагалися створити програму за допомогою Eigen або Boost? Ви здивуєтеся, скільки пам'яті компілятор іноді їсть за допомогою таких програм - і вони самі не повинні бути складними.
Руслан

20

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

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

Альтернативні рішення:

  • Підвисіть швидкість читання swap, помістивши свій розділ swap в RAID1
    • Або RAID0, якщо ви відчуваєте ризик, але це призведе до зниження великої кількості запущених програм, якщо будь-який з ваших дисків не працює.
  • Зменшіть кількість одночасних завдань для збирання ("більше ядер = більша швидкість", ми всі говоримо, забуваючи, що це вимагає лінійного збору на ОЗП)
  • Це може йти обома способами, але спробуйте включити zswapв ядрі. Це стискає сторінки перед тим, як їх надсилати на заміну, що може забезпечити достатньо простого простору, щоб прискорити роботу машини. З іншого боку, це може просто перешкоджати додатковому стисненню / декомпресії.
  • Вимкніть оптимізації або використовуйте інший компілятор. Оптимізація коду іноді може займати кілька гігабайт пам'яті. Якщо у вас LTO увімкнено, ви також будете використовувати багато оперативної пам’яті на етапі зв’язку. Якщо все інше не вдасться, ви можете спробувати скласти свій проект за допомогою більш легкої ваги компілятора (наприклад tcc), за рахунок невеликої продуктивності виконання компільованого продукту. (Це зазвичай прийнятно, якщо ви робите це для цілей розробки / налагодження.)

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

10
@Akiva Ви коли-небудь пробували без своп? Ця відповідь точкова. Я хотів би додати, що біг sudo swapoff -aможе врятувати вас, коли ви вже перебуваєте в зв'язці: це негайно припинить будь-яке додаткове використання місця обміну, тобто вбивця OOM повинен викликатись у наступну мить і привести апарат у робочий стан. sudo swapoff -aтакож є чудовим запобіжним заходом при налагодженні витоків пам'яті або компіляції, скажімо, Firefox. Зазвичай swap трохи корисний (наприклад, для сплячки або заміни дійсно непотрібних речей), але коли ви фактично використовуєте пам'ять, заморожування відбувається гірше.
Jonas Schäfer

2
@Score_Under: Окремі розділи для заміни на кожному диску повинні бути значно ефективнішими, ніж підказка на пристрої md raid0. Я забуваю, де це читав. Вікі Linux RAID рекомендує окремі розділи над raid0, але не говорить нічого дуже сильного про те, чому це краще . У будь-якому випадку так, RAID1 або RAID10n2 має сенс для свопінгу, особливо якщо ви здебільшого просто хочете мати можливість поміняти кілька брудних, але дуже холодних сторінок, щоб залишити більше оперативної пам’яті для кешу сторінок. тобто продуктивність підкачки не є великою справою.
Пітер Кордес

2
Моя думка полягає в тому, що, слідуючи вашим порадам, людина може взагалі не мати змоги запускати ці програми, оскільки їм потрібен обмін Збірка, яка виходить з ладу в 100% часу, гірша, ніж збірка, яка має 50% шансу заблокувати систему, чи не так?
Дмитро Григор’єв

2
Без підкачки на багатьох машинах неможливо скласти великі шматки коду. Чому ви вважаєте, що саме він хоче принести в жертву?
Девід Шварц

14

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

ps -eo pid --no-headers --sort=-%mem | head -1 | xargs kill -9

З:

  • ps -eo pid --no-headers --sort=-%mem: відображення ідентифікаторів процесів усіх запущених процесів, відсортованих за використанням пам'яті
  • head -1: зберігати лише перший рядок (обробляти з використанням найбільшої пам’яті)
  • xargs kill -9: вбити процес

Редагувати після точного коментаря Дмитра:

Це швидке та брудне рішення, яке слід виконувати, коли не виконуються чутливі завдання (завдання, які ви не хочете kill -9).


5
Це набагато гірше, ніж дозволити вбивці ООМ вирішувати ситуацію. Вбивця OOM набагато розумніший за це. Ви справді запускаєте такі команди на комп’ютері з поточними компіляціями?
Дмитро Григор’єв

@DmitryGrigoryev це так розумно, що іноді вбивати Xorg на моєму робочому столі. У сучасних ядрах OOMK, здається, отримав певну розумність, але я б не дуже довіряв цьому.
Руслан

11

Перед тим, як запустити команди, що споживають ресурси, ви також можете використовувати системний виклик setrlimit (2) , ймовірно, з ulimitвбудованою базою оболонки bash (або limitвбудованим в zsh), зокрема, -vдля RLIMIT_AS. Тоді занадто велике віртуальне споживання адресного простору (наприклад , з ттар (2) або sbrk (2) використовується Танос (3) ) НЕ вийде (з егто (3) бути ENOMEM).

Тоді вони (тобто голодні процеси у вашій оболонці після введення ulimit) будуть припинені перед заморожуванням вашої системи.

Читайте також Linux Ate My RAM і розглядайте можливість відключення перевиконання пам'яті (запустивши команду echo 0 > /proc/sys/vm/overcommit_memory як root, див. Proc (5) ...).


11

це часто трапляється зі мною, коли я збираю програмне забезпечення у фоновому режимі

У цьому випадку щось на кшталт "killall -9 make" (або все, що ви використовуєте для управління своєю компіляцією, якщо не робите). Це зупинить процес компіляції далі, ВИБУДОВО всі процеси компілятора, запущені з нього (сподіваємось, змусити їх також зупинитися) і, як бонус, судо не потребує, якщо ви збираєтесь як той самий користувач, який ви зареєстровані в як. А оскільки це вбиває фактичну причину вашої проблеми замість веб-браузера, X сесії або якогось процесу випадковим чином, це не заважатиме тому, що ви робили в системі на той час.


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

ОП не очікує нічого, але відповідає на питання літературне: моя машина для лайна робить непридатною, коли я будую на ній - зупиняйте будівництво на лайно.
9ilsdx 9rvj 0lo

9

Створіть ще кілька своп для себе.

Наступне додасть 8G свопу:

dd if=/dev/zero of=/root/moreswap bs=1M count=8192
mkswap /root/moreswap
swapon /root/moreswap

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


1
У мене цей метод реалізований як сценарій, власне, тут . Досить корисно для додавання свопів на льоту.
Сергій Колодяжний

7
Деякий обмін, як правило, мудрий, але виділення великих сум просто дозволяє машині більше бити перед тим, як вбивця ООМ вступив і забрав добровольця. Хрипта стара роль великого пальця про "подвійний баран як своп" давно мертва. Особисто я не бачу ніякого значення у виділенні більше ніж 1 Гб своп.
Criggie

5
За допомогою ext4 ви можете fallocate -l 8G /root/moreswapзамість того, ddщоб уникнути необхідності робити 8 Гб вводу / виводу, поки система тремтить. Однак це не працює з будь-якою іншою файловою системою. Однозначно не XFS, де swapon бачить неписані розширення як отвори. (Я думаю, що це обговорення списку розсилки xfs не вичерпувалося). Дивіться також swapd, демон, який створює / видаляє файли для заміни на льоту, щоб заощадити місце на диску. Також askubuntu.com/questions/905668/…
Пітер Кордес

1
@Criggie "Особисто я не бачу ніякого значення у виділенні більше ~ 1 Гб свопу" - Ви намагалися створити Firefox?
Дмитро Григор’єв

1
@Akiva Останній раз, коли я перевірив, рекомендована конфігурація збірки становила 16 ГБ оперативної пам’яті. Основний виконуваний файл ( xul.dll) становить близько 50 Мб, тож він у 10 разів важчий за ядро ​​Linux.
Дмитро Григор’єв

5

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

Якщо припустити, що у вас встановлено і налаштовано zram, все, що вам потрібно зробити, це запустити

sudo service zramswap start

Чи працює це у всіх файлових системах, таких як btrfs?
Аківа

1
@Akiva zram ніколи не торкається диска, тому я б сказав так;)
Дмитро Григор'єв

3

sudo swapoff -aвідключить своп, змусивши ядро ​​автоматично знищити процес з найвищим балом, якщо у системи не вистачить пам'яті. Я використовую це, якщо я знаю, що я буду виконувати щось, що є оперативною оперативною пам’яттю, що я б краще вбив, якщо це вийде з-під контролю, ніж відпустити його в своп і назавжди застряг. Використовуйте sudo swapon -aдля повторного включення після цього.

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


О, я щойно бачив, що хтось десь коментував це вище.
судо

3

Ще одне, що можна зробити - це звільнити кеш сторінок пам'яті за допомогою цієї команди:

echo 3 | sudo tee /proc/sys/vm/drop_caches

З документації на kernel.org (наголос додано):

drop_caches

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

Щоб звільнити кеш сторінок: echo 1> / proc / sys / vm / drop_caches Щоб звільнити відновлювані об'єкти плит (включаючи стоматологи та вставки): echo 2> / proc / sys / vm / drop_caches Щоб звільнити плити та об'єкти сторінки: echo 3> / proc / sys / vm / drop_caches

Це неруйнівна операція і не звільнить брудні предмети. Щоб збільшити кількість об'єктів, звільнених цією операцією, користувач може запустити `синхронізацію` перед тим, як записати в / proc / sys / vm / drop_caches. Це зведе до мінімуму кількість брудних об’єктів у системі та створить більше кандидатів, які потрібно скинути.


Цікаво ... дбаєте пояснити цю логіку команди?
Аківа

1
@Akiva в основному це говорить ядра Linux звільнити оперативну пам'ять. Це не позбудеться причини, яка вбиває ображений процес, тому відповідь Олі - це вирішення проблеми. Видалення кеш-пам’яті запобіжить втраті пам’яті у вашій системі, тому запобігайте зависанню, тим самим купуючи вам час для з'ясування фактичної проблеми. Це, мабуть, буде трохи швидше, ніж робити файл swap, особливо якщо ви на жорсткому диску, а не на SSD
Сергій Колодяжний

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

2
@Score_Under - "Кеш - це перше, що потрібно робити, коли ви заповнюєте пам'ять" - добре, це залежить від вашого налаштування в /proc/sys/vm/swappiness. З заміщенням, встановленим на 0, ви маєте рацію. Якщо за замовчуванням встановлено 60, ви близькі. Однак, якщо він встановлений на 200, це будуть найменш використовувані останні сторінки сторінок запущених процесів, які випадають першими ... у цьому конкретному випадку ця команда може бути корисною. Але встановлення заміщення на 0 (або якесь низьке значення, можливо, 20 або 30) було б краще загальним підходом.
Жуль

3
@Score_Under Ця команда була корисною для старих ядер із kswapdпомилкою (деякі люди навіть створювали за допомогою неї). Але ти маєш рацію, сумніваюся, це допоможе у цьому питанні.
Дмитро Григор’єв

1

Ви сказали "компіляція на задньому плані". Що ти робиш на передньому плані? Якщо ви розробляєте програму Eclipse або інший важкий IDE, перевірте, чи все правильно завершено в консолі.

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

Перевірте, чи припинено все, що має бути припинено в IDE.

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