Выполнение любой команды возвращает «Не удается выделить память» на сервере Ubuntu

16

Я использую Ubuntu 14.04. Недавно, когда я вхожу через SSH с моим пользователем с привилегиями sudo, каждая команда, которую я запускаю, приводит к ошибке «Не удается выделить память». Вот несколько, которые я попробовал на своей консоли

myuser@mymachine:~$ whoami
-bash: fork: Cannot allocate memory
myuser@mymachine:~$ uname -a
-bash: fork: Cannot allocate memory

Даже если я попытаюсь, sudo reboot nowя получу вышеуказанную ошибку, поэтому я не знаю, что еще я могу попытаться разблокировать мой экземпляр. Хост DigitalOcean, если это имеет значение.

Редактировать: В соответствии с ответом / предложением, приведенным здесь, вывод «бесплатно»

myuser@mymachine:~$ free
-bash: fork: Cannot allocate memory
Дейв
источник

Ответы:

12

Решение

Как говорится в сообщениях об ошибках, на вашей машине не хватает памяти. Это может быть по ряду причин, но в основном что-то поглощает всю вашу память и не оставляет ничего, даже для базового использования команды.

Я бы посоветовал перезагрузить дроплет (просто перейдите на панель управления клиентом и выберите «Перезагрузка»), sshа затем запустите topили htop. Следите за использованием памяти и посмотрите, какой процесс использует всю память. Оттуда попробуйте либо

  1. Уничтожение / удаление неисправной программы / процесса

    ПРЕДУПРЕЖДЕНИЕ . ПОЖАЛУЙСТА , сначала изучите, является ли процесс важным системным процессом! Если системный процесс вызывает проблемы с памятью, не просто уничтожайте его, а исследуйте его и найдите конкретные способы его устранения.
  2. Изменение конфигурации для этой программы / процесса, чтобы она не поглощала всю вашу память.

Предложения по предотвращению повторения проблемы

  • Что-то хорошее, что нужно сделать, это добавить память подкачки , так как она выделяет больше памяти, если у вас заканчивается.
  • Всякий раз, когда вы устанавливаете программы, убедитесь, что вы настроили их правильно, чтобы они не работали непреднамеренным образом (например, расходует память)
  • После того, как вы каждый раз добавляете пакет или в основном что-то новое, проверяете с помощью htopили topчтобы увидеть, сколько памяти вы используете с текущими программами. Если вы заметили, что используете почти все, попробуйте очистить некоторые, пройдя и удалив ненужные программы / процессы.
  • Если есть что-то, что запускается автоматически (помимо системных процессов, конечно!), Которое вы не можете распознать или хотите запустить автоматически, удалите его! Но всегда проверяйте, что представляет собой процесс, прежде чем убивать / удалять его, поскольку это может быть важно для процедур загрузки, системных функций и т. Д.
Странный
источник
7

Чтобы выйти из этого состояния без перезагрузки, вы можете вручную запустить OOM killer следующим образом:

echo 1 > /proc/sys/kernel/sysrq
echo f > /proc/sysrq-trigger
echo 0 > /proc/sys/kernel/sysrq

Ссылка

Люк Ф
источник
Есть ли у вас документация, поддерживающая эти команды? Почему бы просто sudo sysctl -w vm.oom_kill_allocating_task=1или постоянно/etc/sysctl.conf .
Пабло Бьянки
1
Не похоже, что это будет иметь значение, система не достигает фактического состояния OOM, если это происходит в состоянии покоя, потому что ни один процесс не пытается выделить память и никакие дополнительные процессы не могут быть запущены. И полуотносительно, но вы не сможете использовать sudo или sysctl один раз в этом состоянии.
Люк Ф
Это сработало для меня. Не знаю как, все равно. Я даже не мог бежать, sudo rebootпрежде чем запустить это. Благодарность!
boulder_ruby
0

В дополнение к принятому ответу необходимо учесть еще одну вещь: ваша система может исчерпать файловые дескрипторы или даже буферы сокетов и все еще иметь много памяти, одновременно выдавая ту же ошибку. Это особенно верно, если общий хостинг налагает ограничения такого характера. В системах OpenVZ смотрите содержимое

# cat / proc / user_beancounters

Это даст вам в самом правом столбце первые переполнения. Если это так, либо перейдите к более крупному пакету хостинга, либо выследите наиболее вероятного виновника: базу данных mysql или mariadb, которая может, в случае неисправного приложения PHP, пропускать файл до сотни в секунду.

Это также может произойти, если на вашем веб-сервере ssh открыт для доступа в Интернет и принимает логины с именами пользователей и паролями: даже если у вас запущен fail2ban, возможно, вы столкнулись с попыткой разбить распределенный словарь при попытке, которая также потребляет много ресурсов.

aquaherd
источник