В Ubuntu быстро заканчивается ОЗУ, и мой компьютер начинает зависать. Какая команда это решит?

73

Это случается довольно часто со мной, когда я компилирую программное обеспечение в фоновом режиме, и внезапно все начинает замедляться и, в конечном итоге, зависать [если я ничего не делаю], так как у меня заканчивается как ОЗУ, так и пространство подкачки.

Этот вопрос предполагает, что у меня достаточно времени и ресурсов, чтобы открыть терминал Gnome, выполнить поиск по моей истории и выполнить одну sudoкоманду.

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

Акива
источник
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Томас Уорд
1
Если вам не хватает места подкачки, я думаю, что у вас его слишком мало. Я получил 20G пространства подкачки на этом компьютере. Смысл в том, чтобы дать вам достаточно времени с работающей системой, чтобы убить все, что съедает вашу память. Это не то, где вы берете только то, что будете использовать, но то, что вы надеетесь, что никогда не будете использовать.
JoL
1
Вы уверены, что и RAM и swap заполнены? Если бы это было так, обработчик OOM убил бы ваш компилятор и освободил бы память (а также испортил бы ваш процесс сборки). В противном случае, я думаю, что он просто заполняется, и, возможно, ваша система работает медленно, потому что ваш своп находится на системном диске.
Судо
3
Попробуйте уменьшить количество параллельных сборок, если у вас недостаточно оперативной памяти для его поддержки. Если ваша сборка начнет меняться, вы будете медленнее. С make, попробуйте, -j4например, для 4 параллельных сборок одновременно.
Шахбаз
1
«Алекса

Ответы:

84

По моему опыту, Firefox и Chrome используют больше оперативной памяти, чем мои первые 7 компьютеров вместе взятых. Вероятно, больше, чем это, но я ухожу от своей точки зрения. Самое первое, что вы должны сделать, это закрыть ваш браузер . Команда?

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

Я связал самые популярные браузеры в одну команду, но, очевидно, если вы запускаете что-то другое (или знаете, что вы не используете один из них), просто измените команду. Это killall -9 ...важный бит. Люди действительно сомневаются SIGKILL(сигнал № 9), но браузеры чрезвычайно устойчивы. Более того, медленное завершение через via SIGTERMбудет означать, что браузер загружает весь мусор, который требует огромного количества дополнительной оперативной памяти, и это то, что вы не можете себе позволить в этой ситуации.

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

Долгосрочное решение подразумевает либо покупку большего количества оперативной памяти, аренду ее через удаленный компьютер, либо не выполнение того, что вы делаете в данный момент. Я оставляю сложные экономические аргументы на ваше усмотрение, но, в целом, оперативная память - это дешево, но если вам нужна только пакетная сумма, VPS-сервер, тарифицируемый за минуту, или час - это хороший выбор.

Оли
источник
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Томас Уорд
У меня есть пара команд, связанных с моей собственной lazygitкомандой, которую я время от времени использую, может быть, что-то подобное можно применить здесь? Весь killall ...сценарий может быть сведен к простому emptyramили что-то в этом роде
Francisco Presencia
Вам не нужно запускать полную команду, если вы знаете, какой браузер работает, и я полагаю, что большинство людей, которые могут определить нехватку ОЗУ, делают это. emptyramБолее того , мне было бы сложнее вспомнить, что я написал сценарий, чем просто пробить killall -9 firefox.
Оли
2
Покупка ОЗУ ... почему бы просто не загрузить больше ОЗУ?
Стефан Бийзиттер
1
Что ж, вы можете пошутить, но если вам нужно сделать что-то в течение короткого времени, которое требует гораздо больше оперативной памяти и процессора, то аренда VPS за минуту довольно экономична для одного удара.
Оли
66

В системе с включенной клавишей Magic System Request Key нажатие Alt + System Request+ f(если оно не отмечено на клавиатуре, System Requestчасто находится на Print Screenклавише) вручную вызовет убийцу нехватки памяти в ядре (oomkiller), которая пытается выбрать самый неприятный процесс для пользователя. использование памяти и убить его. Вы можете сделать это, если у вас есть, возможно, меньше времени, чем вы описали, и система вот-вот начнет (или, возможно, уже начала) работать - в этом случае вас, вероятно, не волнует, что именно будет убито, просто вы закончите с удобной системой. Иногда это может закончиться убийством Х, но в большинстве случаев в наши дни гораздо лучше выбрать плохой процесс, чем раньше.

Muzer
источник
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 не очень сложен с точки зрения компилятора. На самом деле вряд ли есть какие-либо программы на C, которые есть. А как насчет C ++? Вы когда-нибудь пробовали создать программу с использованием Eigen или Boost? Вы будете удивлены тем, сколько памяти компилятор иногда использует с такими программами - и они не должны быть сложными сами по себе.
Руслан
20

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

Я бы порекомендовал отключить подкачку во время выполнения этой задачи, так что убийца нехватки памяти будет действовать, как только ОЗУ заполнится.

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

  • Увеличьте скорость чтения подкачки, поместив раздел подкачки в RAID1
    • Или RAID0, если вы чувствуете себя рискованно, но это приведет к остановке большого количества работающих программ, если какой-либо из ваших дисков будет работать неправильно.
  • Уменьшите число одновременных заданий на сборку («все больше ядер = больше скорости», мы все говорим, забывая, что это требует линейной потери ОЗУ)
  • Это может пойти обоими путями, но попробуйте включить zswapядро. Это сжимает страницы до того, как они будут отправлены для обмена, что может обеспечить достаточно места для маневрирования, чтобы ускорить работу вашего компьютера. С другой стороны, это может просто стать помехой для дополнительной компрессии / декомпрессии, которую он делает.
  • Отключите оптимизацию или используйте другой компилятор. Оптимизация кода иногда может занимать несколько гигабайт памяти. Если у вас включен LTO, вы также будете использовать много оперативной памяти на этапе соединения. Если ничего не помогло, вы можете попробовать скомпилировать проект с помощью более легкого компилятора (например tcc), за счет небольшого снижения производительности во время выполнения для скомпилированного продукта. (Обычно это приемлемо, если вы делаете это для целей разработки / отладки.)
Score_Under
источник
6
Если у вас отключен своп, это поведение Linux, когда у вас заканчивается память. Если Linux не вызывает убийцу нехватки памяти, а вместо этого зависает, это может означать, что существуют более серьезные проблемы с установкой. Конечно, если включен своп, поведение будет немного другим.
Score_Under
10
@Akiva Вы когда-нибудь пробовали без свопа? Этот ответ точен. Я хотел бы добавить, что запуск sudo swapoff -aможет спасти вас, когда вы уже находитесь в привязке: он немедленно прекратит любое дополнительное использование пространства подкачки, то есть убийца OOM должен быть вызван в следующий момент и приведёт машину в рабочее состояние. sudo swapoff -aЭто также отличная мера предосторожности при отладке утечек памяти или компиляции, скажем, Firefox. Обычно подкачка немного полезна (например, для режима гибернации или замены действительно ненужных вещей), но когда вы на самом деле используете память, зависания хуже.
Йонас Шефер
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).

Gohu
источник
5
Это намного хуже, чем позволить убийце OOM справиться с ситуацией. Убийца ООМ намного умнее этого. Вы действительно запускаете такие команды на компьютере с текущими компиляциями?
Дмитрий Григорьев
@DmitryGrigoryev иногда очень разумно убивать Xorg на моем рабочем столе. В современных ядрах ООМК, похоже, обрел некоторое здравомыслие, но я бы не стал доверять ему после всего этого.
Руслан
11

Перед запуском команд, потребляющих ресурсы, вы также можете использовать системный вызов setrlimit (2) , возможно, со ulimitвстроенной оболочкой bash (или limitвстроенной в zsh), особенно с -vfor 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» (или что вы используете для управления вашей компиляцией, если не make). Это остановит дальнейшую компиляцию, SIGHUP запустит все процессы компилятора, запущенные из нее (возможно, и заставит их остановиться), и, в качестве бонуса, не нуждается в sudo, если вы компилируете под тем же пользователем, который вошел в систему. в качестве. И поскольку он убивает реальную причину вашей проблемы, а не ваш веб-браузер, сеанс X или какой-либо случайный процесс, он не будет мешать тому, что вы делали в системе в то время.

fluffysheap
источник
2
Это просто позор, что мне пришлось прокрутить вниз, чтобы найти этот ответ. Я надеялся, что кто-нибудь предложит способ, который приостановит продвижение в этом модуле памяти.
TOOGAM
OP не имеет ничего общего с ответом, которого ожидает OP, но он отвечает на литературный вопрос: моя машина для дерьма становится непригодной для использования, когда я строю ее - перестаньте строить на машине для дерьма.
9ilsdx 9rvj 0lo
9

Создайте еще один своп для себя.

Следующее добавит 8G свопа:

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

Это все еще будет медленным (вы меняете), но на самом деле вы не должны заканчиваться. Современные версии Linux могут заменять файлы. В наши дни единственным разделом для раздела подкачки является использование компьютера в спящем режиме.

Уильям Хэй
источник
1
У меня этот метод реализован в виде скрипта, на самом деле, здесь . Весьма полезно для добавления свопа на лету.
Сергей Колодяжный
7
Некоторый обмен, как правило, целесообразен, но выделение больших сумм просто позволяет машине побеждать еще до того, как убийца ООМ вмешается и выберет добровольца. Долгое время давняя давняя роль большого пальца о том, чтобы «удвоить свой баран, как своп». Лично я не вижу смысла в выделении более ~ 1 ГБ общего объема подкачки.
Кригги
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 , который создает сжатый RAM-диск и заменяет его. С любым полуприличным процессором это намного быстрее, чем при обычном обмене, и степень сжатия довольно высока для многих современных оперативных устройств, таких как веб-браузеры.

Предполагая, что у вас установлен и настроен zram, все, что вам нужно сделать, это запустить

sudo service zramswap start
Дмитрий Григорьев
источник
Работает ли это на всех файловых системах, таких как btrfs?
Акива
1
@Akiva zram никогда не трогает диск, поэтому я бы сказал да;)
Дмитрий Григорьев
3

sudo swapoff -aотключит своп, заставляя ядро ​​автоматически убивать процесс с наибольшим количеством очков, если системе не хватает памяти. Я использую это, если знаю, что у меня будет что-то тяжелое в ОЗУ, которое я предпочел бы убить, если оно выйдет из-под контроля, чем позволить ему перейти в режим подкачки и застрять навсегда. Используйте, sudo swapon -aчтобы включить его позже.

Позже вы можете захотеть взглянуть на настройки свопинга. Похоже, ваш своп находится на том же диске, что и корневой раздел, что замедлит работу вашей системы, когда вы нажмете своп, поэтому избегайте этого, если можете. Также, на мой взгляд, современные системы часто настраиваются с помощью слишком большого количества операций подкачки. Оперативная память 32 ГБ обычно означает, что по умолчанию выделяется подкачка 32 ГБ, как если бы вы действительно хотели поместить 32 ГБ в пространство подкачки.

Судо
источник
О, я только что увидел, что кто-то прокомментировал это где-то выше.
Судо
3

Еще одно, что можно сделать, это освободить кеш страницы памяти с помощью этой команды:

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

Из документации на kernel.org (выделение добавлено):

drop_caches

Запись этого приведет к тому, что ядро ​​удалит чистые кэши, а также исправляемые объекты плиты, такие как зубные камни и иноды. После того, как упал, их память становится свободной .

Чтобы освободить кэш страницы: echo 1> / proc / sys / vm / drop_caches Чтобы освободить восстанавливаемые объекты плиты (включая dentries и inode): echo 2> / proc / sys / vm / drop_caches Чтобы освободить объекты плиты и pagecache: echo 3> / proc / SYS / VM / drop_caches

Это неразрушающая операция, которая не освобождает грязные предметы. Чтобы увеличить количество объектов, освобождаемых этой операцией, пользователь может запустить синхронизацию перед записью в / proc / sys / vm / drop_caches. Это сведет к минимуму количество грязных объектов в системе и создаст больше кандидатов для удаления.

Сергей Колодяжный
источник
Интересно ... хочешь объяснить эту командную логику?
Акива
1
@Akiva в основном говорит ядру Linux освободить оперативную память. Это не избавляет от причины, которая убивает оскорбительный процесс, поэтому ответ Оли - это решение проблемы. Удаление кешей предотвратит нехватку памяти в вашей системе, поэтому предотвратит зависание, что даст вам время для выяснения фактической проблемы. Это, вероятно, будет немного быстрее, чем создание файла подкачки, особенно если вы находитесь на жестком диске, а не на SSD
Сергей Колодяжный
7
Кеш - это первое, что нужно сделать, когда вы заполняете память, поэтому я не думаю, что это сильно поможет. На самом деле, я не думаю, что эта команда имеет практическое применение вне отладки поведения ядра или оптимизации времени доступа к диску. Я бы скромно рекомендовал не запускать эту команду в любой системе, нуждающейся в большей производительности.
Score_Under
2
@Score_Under - «Кеш - это первое, что нужно сделать, когда вы заполняете память» - ну, это зависит от ваших настроек /proc/sys/vm/swappiness. Если swappiness установлен в 0, вы правы. С настройкой по умолчанию 60, вы близки. Однако при значении 200 это будут наименее используемые страницы запущенных процессов, которые будут сброшены первыми ... в этом конкретном случае эта команда может быть полезна. Однако установка swappiness на 0 (или какое-то низкое значение, может быть, 20 или 30) будет лучшим общим подходом.
Жюль
3
@Score_Under Эта команда была полезна на старых ядрах с kswapdошибкой (некоторые люди даже создавали cronjobs с ее помощью). Но вы правы, я сомневаюсь, что это поможет с этим вопросом.
Дмитрий Григорьев
1

Вы сказали "компиляция в фоновом режиме". Что ты делаешь на переднем плане? Если вы разрабатываете с Eclipse или другой ресурсоемкой IDE, проверьте, все ли правильно завершено в консоли.

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

Проверьте, завершено ли все, что должно быть завершено в IDE.

h22
источник