Назад | Перейти на главную страницу

Когда в Linux заканчивается память?

Я пытаюсь установить, почему процесс продолжает неожиданно останавливаться, и одна из возможных причин заключается в том, что на сервере заканчивается память, но я не уверен, что правильно понимаю память и 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: вещи, общие для процессов - в основном общие библиотеки.
  • Буферы: обычные буферы ядра.
  • Кешируется: якобы буфер-кеш.

Теперь вторая строка показывает, что «действительно используется». например, то, что в баране, которое нельзя забыть без последствий. А поле «free» во второй строке - это сумма неиспользованной оперативной памяти и буферного кеша.

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

Прямо сейчас похоже, что вы используете твердые ~ 360 МБ из своего 1 ГБ. Если вы обеспокоены или подозреваете, что у вас заканчивается память, проверьте сообщения журнала ядра. Ядро будет регистрировать, когда достигнет ситуации абсолютной нехватки памяти и необходимости что-то сделать. Он вызовет убийцу нехватки памяти в надежде, что он может спасти ситуацию, отключив один процесс.

Сначала я подумал, что это VPS. Если это физический сервер и у вас нет дополнительной оперативной памяти, которую вы можете добавить к нему, подумайте о добавлении пространства подкачки!

В противном случае проверьте / var / log на наличие сообщений журнала или в командной строке просто используйте dmesg для проверки последних сообщений ядра.