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

72

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

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

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

    
задан Akiva 03.07.2017 в 11:15
источник

11 ответов

84

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

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

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

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

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

    
ответ дан Oli 03.07.2017 в 11:30
66

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

    
ответ дан Muzer 03.07.2017 в 12:44
20

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

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

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

  • Увеличьте скорость чтения свопинга, разместив свой раздел подкачки в RAID1
    • Или RAID0, если вы чувствуете себя рискованно, но это приведет к сбою большого количества запущенных программ, если какой-либо из ваших дисков неисправен.
  • Уменьшите количество параллельных заданий сборки («больше ядер = больше скорости», мы все говорим, забывая, что он требует линейных потерь в ОЗУ)
  • Это может идти в обоих направлениях, но попробуйте включить zswap в ядре. Это сжимает страницы перед их отправкой на swap, что может обеспечить достаточно пространство для маневра, чтобы ускорить работу вашего компьютера. С другой стороны, это может быть просто помехой с дополнительным сжатием / декомпрессией, которое он делает.
  • Уменьшите оптимизацию или используйте другой компилятор. Оптимизация кода иногда может занимать несколько гигабайт памяти. Если вы включили LTO, вы также будете использовать много оперативной памяти на этапе соединения. Если все остальное не удается, вы можете попытаться скомпилировать свой проект с помощью компилятора более легкого веса (например, tcc ), за счет небольшой производительности, связанной с производимым компилятором. (Обычно это приемлемо, если вы делаете это для целей разработки / отладки.)
ответ дан Score_Under 03.07.2017 в 19:47
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 03.07.2017 в 17:12
11

this happens pretty often to me when I am compiling software in the background

В этом случае что-то вроде «killall -9 make» (или того, что вы используете для управления своей компиляцией, если не сделать). Это остановит дальнейшую компиляцию, выполнит SIGHUP все процессы компилятора, запущенные из него (надеюсь, что они также остановятся), а в качестве бонуса не требуется sudo, предполагая, что вы компилируете в качестве того же пользователя, которого вы зашли в систему в. И поскольку он убивает фактическую причину вашей проблемы, а не ваш веб-браузер, X-сессию или какой-то случайный процесс, она не будет мешать тому, что вы делали в системе в то время.

    
ответ дан fluffysheap 05.07.2017 в 09:34
11

Прежде чем запускать свои ресурсы, вы также можете использовать setrlimit (2) , возможно, с ulimit встроенной оболочки вашего bash ( или limit , встроенное в zsh), в частности, с -v для RLIMIT_AS . Затем слишком большое потребление виртуального адресного пространства (например, mmap (2) или sbrk (2) , используемый malloc (3) ) не удастся (с errno (3) является ENOMEM ).

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

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

    
ответ дан Basile Starynkevitch 04.07.2017 в 07:42
9

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

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

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

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

    
ответ дан William Hay 03.07.2017 в 16:35
4

Один из способов получить кусок свободной оперативной памяти в кратчайшие сроки - использовать zram , который создает сжатый RAM-диск и меняет местами. С любым полуприличным процессором это намного быстрее, чем обычный обмен, а уровень сжатия довольно высок со многими современными RAM-RAM, такими как веб-браузеры.

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

sudo service zramswap start
    
ответ дан Dmitry Grigoryev 04.07.2017 в 15:01
3

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

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

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

drop_caches

Writing to this will cause the kernel to drop clean caches, as well as reclaimable slab objects like dentries and inodes. Once dropped, their memory becomes free.

To free pagecache: echo 1 > /proc/sys/vm/drop_caches To free reclaimable slab objects (includes dentries and inodes): echo 2 > /proc/sys/vm/drop_caches To free slab objects and pagecache: echo 3 > /proc/sys/vm/drop_caches

This is a non-destructive operation and will not free any dirty objects. To increase the number of objects freed by this operation, the user may run 'sync' prior to writing to /proc/sys/vm/drop_caches. This will minimize the number of dirty objects on the system and create more candidates to be dropped.

    
ответ дан Sergiy Kolodyazhnyy 03.07.2017 в 17:13
2

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

Позже вы можете взглянуть на свои настройки свопинга. Похоже, ваш своп находится на том же диске, что и корневой раздел, что замедлит вашу систему, когда вы нажмете swap, поэтому избегайте этого, если сможете. Кроме того, на мой взгляд, современные системы часто настраиваются со слишком большим количеством свопов. 32GiB RAM обычно означает, что по умолчанию выделяется своп 32GiB, как если бы вы действительно хотели поместить 32GiB в свое пространство подкачки.

    
ответ дан sudo 07.07.2017 в 19:02
1

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

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

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

    
ответ дан h22 08.07.2017 в 10:00