Когда в 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 в памяти.

1
задан 20 January 2014 в 18:13
1 ответ

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

Имейте в виду, что есть буферный кеш, а затем есть обычные буферы ядра (для сокетов tcp, таблицы маршрутизации и т. Д.)

Итак, бесплатная команда в первой строке показывает вам: Итого: Сколько у тебя барана, и точка. Используется: сколько в нем на самом деле чего-то ценного. Бесплатно: Абсолютно неиспользованный - может быть не пустой, но там какой бы мусор. Shared: вещи, общие для процессов - в основном общие библиотеки. Буферы: обычные буферы ядра. Cached: якобы буфер-кеш.

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

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

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

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

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

3
ответ дан 3 December 2019 в 18:47

Теги

Похожие вопросы