На этот вопрос уже есть ответ здесь:
Я пытаюсь установить, почему процесс продолжает неожиданно останавливаться, и одна из возможностей заключается в том, что серверу не хватает памяти, но я не уверен, что правильно понимаю память и Linux.
Возьмите следующий вывод команды free
(взят с того же компьютера, на котором была обнаружена проблема, которую я пытаюсь исправить):
total used free shared buffers cached
Mem: 991 827 163 0 107 361
-/+ buffers/cache: 358 633
Swap: 0 0 0
Верхняя строка предполагает, что эта машина действительно использует много память (всего 163 Мбайт свободно), и поэтому, если запустятся еще несколько процессов (что они и делают), то у нас может возникнуть ситуация нехватки памяти с завершением различных процессов.
Однако меня всегда приводили к мнению, что, поскольку Linux широко использует буферы и кеши в памяти, которые можно использовать при необходимости, цифра, на которую мне следует обратить больше внимания, - это вторая строка, которая предполагает, что ~ 633 Мб свободно, и в этом случае я думаю, что на этой машине не хватает памяти.
Не могли бы вы прояснить мое понимание Linux и памяти и помочь мне понять, когда Linux действительно исчерпывает память?
PS - эта машина является одноцелевой машиной - она запускает фоновый процесс для большого веб-приложения, это все, что он делает. Ни веб-сервера, ни базы данных, только одно огромное приложение Ruby on Rails, работающее в фоновом режиме. Периодические задания cron запускаются для определенных задач приложения, которые временно создают другой экземпляр приложения rails в памяти.
Ядро использует оперативную память, которая иначе не используется для кэширования данных, считанных из хранилища - это называется буферным кешем. Поскольку буферный кеш - это просто копия того, что находится на жестком диске, если ядру когда-либо понадобится память для чего-то более важного, оно может просто «забыть» копию этих данных в памяти и использовать ее для чего-то еще. Если бы ему когда-нибудь понадобились эти данные, он бы просто перечитал их с диска.
Имейте в виду, что есть буферный кеш, а затем есть обычные буферы ядра (для сокетов tcp, таблицы маршрутизации и т. Д.)
Итак, бесплатная команда в первой строке показывает вам: Итого: Сколько у тебя барана, и точка. Используется: сколько в нем на самом деле чего-то ценного. Бесплатно: Абсолютно неиспользованный - может быть не пустой, но там какой бы мусор. Shared: вещи, общие для процессов - в основном общие библиотеки. Буферы: обычные буферы ядра. Cached: якобы буфер-кеш.
Теперь вторая строка показывает вам, что «действительно используется». например, то, что в баране, которое нельзя забыть без последствий. А поле «свободное» во второй строке представляет собой сумму неиспользованной оперативной памяти и буферного кеша.
Последняя строка будет включать пространство подкачки - пространство хранения, в которое ядро может записывать важную информацию в память, чтобы оно могло использовать это место в памяти для чего-то еще. Но, судя по вашему снимку экрана, у вас ничего не настроено.
Прямо сейчас похоже, что вы используете твердые ~ 360 МБ из своего 1 ГБ. Если вы обеспокоены или подозреваете, что у вас заканчивается память, проверьте сообщения журнала ядра. Ядро будет регистрировать, когда достигнет ситуации абсолютной нехватки памяти и необходимости что-то сделать. Он вызовет убийцу нехватки памяти в надежде, что он может спасти ситуацию, отключив один процесс.
Сначала я подумал, что это VPS. Если это физический сервер и у вас нет дополнительной оперативной памяти, которую вы можете добавить к нему, подумайте о добавлении пространства подкачки!
В противном случае проверьте / var / log на наличие сообщений журнала или в командной строке просто используйте dmesg, чтобы проверить последние сообщения ядра.