Я пытаюсь установить, почему процесс продолжает неожиданно останавливаться, и одна из возможных причин заключается в том, что на сервере заканчивается память, но я не уверен, что правильно понимаю память и 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, таблицы маршрутизации и т. Д.)
Итак, бесплатная команда в первой строке показывает вам:
Теперь вторая строка показывает, что «действительно используется». например, то, что в баране, которое нельзя забыть без последствий. А поле «free» во второй строке - это сумма неиспользованной оперативной памяти и буферного кеша.
Последняя строка будет включать пространство подкачки - пространство хранения, в которое ядро может записывать важную информацию в память, чтобы оно могло использовать это место в памяти для чего-то еще. Но, судя по вашему скриншоту, у вас ничего не настроено.
Прямо сейчас похоже, что вы используете твердые ~ 360 МБ из своего 1 ГБ. Если вы обеспокоены или подозреваете, что у вас заканчивается память, проверьте сообщения журнала ядра. Ядро будет регистрировать, когда достигнет ситуации абсолютной нехватки памяти и необходимости что-то сделать. Он вызовет убийцу нехватки памяти в надежде, что он может спасти ситуацию, отключив один процесс.
Сначала я подумал, что это VPS. Если это физический сервер и у вас нет дополнительной оперативной памяти, которую вы можете добавить к нему, подумайте о добавлении пространства подкачки!
В противном случае проверьте / var / log на наличие сообщений журнала или в командной строке просто используйте dmesg для проверки последних сообщений ядра.