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

9

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

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

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

Аарон К
источник

Ответы:

19

Не путайте свободную память с неиспользуемой памятью. Свободная память в мире 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 недавно появилась статья, в которой обсуждается эта проблема .

Дейв Чейни
источник
1
Здесь также приводится простое объяснение: linuxatemyram.com
Стивен Т. Снайдер,
4

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

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

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

free -m
             total       used       free     shared    buffers     cached
Mem:          6035       5888        147          0         77       4116
-/+ buffers/cache:       1693       4341
Swap:         4722          0       4722
Ryaner
источник
1

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

jj33
источник
1

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

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

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

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

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

Тим Пост
источник
1

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

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

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

Майк Паунтни
источник