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

Почему Red Hat Linux сообщает о том, что в системе меньше свободной памяти, чем доступно на самом деле?

У меня есть относительно небольшой домашний сервер Red Hat Linux (около 8 ГБ ОЗУ). Я не использую его для чего-то другого, кроме запуска некоторых домашних приложений, чтобы отслеживать различные вещи. Единственное, что работает на коробке, - это база данных и веб-сервер.

Я заметил, что при проверке системных счетчиков с помощью таких инструментов, как NMON и TOP, общая свободная память системы относительно мала (порядка нескольких сотен МБ), в то время как активная память для базы данных и веб-сервера все еще остается низкой (только потребляет в совокупности 3 ГБ). Даже с учетом всех остальных запущенных процессов общий объем потребляемой памяти составляет менее 4 ГБ.

Почему Red Hat Linux сообщает меньше свободной памяти, чем общая память за вычетом общей суммы используемой памяти запущенных процессов?

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

% free -m
             total       used       free     shared    buffers     cached
Mem:           997        942         55          0         71        366
-/+ buffers/cache:        504        492
Swap:         2015        618       1397

Linux (и все ОС Unix) стараются иметь как можно меньше свободной памяти. Вместо этого они используют память, которая не отображается активно для процессов в работающей ОС, для таких вещей, как файловый кеш и буферы для различных операций передачи ввода-вывода.

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

  1. Память может быть разделена между различными процессами через Копирование при записи выделение памяти, ввод-вывод с отображением памяти и общие динамические библиотеки.
  2. Операционная система может пообещать приложению больше памяти, чем она фактически предоставила. Теоретически большинство разработчиков приложений предпочитают запрашивать большой объем памяти за один раз, чтобы избежать накладных расходов, и могут фактически не использовать всю эту память.

Есть недавняя статья о lwn.net обсуждает этот вопрос.

Linux будет активно кэшировать доступ к файловой системе в память, чтобы сократить время доступа к диску. Не о чем беспокоиться.

Выполнение команды free -m на поле даст вам лучшее представление о том, где используется память.

Ниже приведен результат, полученный из одного из моих ящиков. Свободная память составляет 147Meg с почти 4G кэшированием для запросов доступа к файловой системе.

free -m
             total       used       free     shared    buffers     cached
Mem:          6035       5888        147          0         77       4116
-/+ buffers/cache:       1693       4341
Swap:         4722          0       4722

В linux посмотрите Committed_AS в / proc / meminfo, это объем памяти (реальный + своп), который ядро ​​фактически обещало запущенным процессам.

Linux очень эффективно использует память, любые блоки не Обещанный некоторый процесс используется для кеширования недавно / часто используемых файлов. Итак, для Linux типично использовать 90% всей доступной физической памяти вскоре после загрузки.

Посмотрите, что ядро ​​обязалось предоставить ... и грязное использование (свопинг), это даст вам лучшую общую картину.

Если вам нужно изменить это поведение, обновите свой вопрос :)

Это стандартный MO для Linux ... некоторые дистрибутивы настраивают управление памятью в соответствии со своими потребностями через sysctl. Однако то, что вы сообщаете, довольно типично среди всех.

Вы также включаете поля «буферизованный» и «кешированный»?

Какое ядро ​​вы используете в системе? 32-разрядное ядро ​​сообщает только около 3,6 ГБ памяти, если оно не скомпилировано с включенным PAE.

При этом, если это современная версия Redhat Enterprise Linux (или CentOS) - начиная с v3 - 32-разрядное ядро ​​по умолчанию будет включать эту функцию.

Если вы могли бы опубликовать вывод команды «бесплатно», описанный выше, мы сможем увидеть, является ли это проблемой.