28 февраля 2020 г.

Оперативная память в Linux: особенности управления и мониторинг

Те, кто читает мой блог на постоянной основе, знают, что я очень люблю операционные системы Unix за их изящность, простоту и надёжность. В начале моей карьеры судьба свела меня с коммерческой реализацией операционной системы Unix от компании Hewlett Packard - HP-UX. Очень долго и плотно я работал с данной операционной системой. Но время не стоит на месте и надо признать, что HP-UX на данный момент утратила свои позиции и всё больше и больше серверов (причём не только HP) передают под управление операционной системы Linux. 

Если вернуться к моей скромной персоне, то у меня тенденция идентичная - HP-UX уходит, а Linux в моей работе становится всё больше. Не смотря на то, что операционная система Linux основана на Unix концепции и, по большому счёту, удовлетворяет стандарту POSIX, она, как и любая другая реализация Unix, имеет свои особенности. Сегодня попробуем разобраться с управлением памятью в Linux.

Основную мысль, которую я усвоил, разбираясь в этом вопросе - Linux всегда использует всю оперативную память, которая есть у сервера. Поэтому не так просто ответить на вопрос: хватает ли серверу памяти и каким запасом по ней он обладает? Но обо всём по порядку.

На уровне командной строки существует три команды, которые помогут нам посмотреть информацию по оперативной памяти сервера:
  • top
  • free
  • cat /proc/meminfo

Команда top служит для вывода информации по текущей загрузке сервера, отображая работающие процессы, использование ими ресурсов процессора и памяти сервера. Нас в контексте использования оперативной памяти интересуют 2 строки в шапке вывода команды (рис. 1).

Рис. 1. Пример вывода команды top на сервере с Linux.

Из вывода мы видим, что всего операционная система видит 193 711 Мб физической памяти, из них только 833 Мб свободно. При этом настроено 131 068 Мб в области подкачки (swap) и почти вся она свободна. По информации от одной этой команды можно сделать преждевременные выводы:
- процессы сервера используют почти всю память, 
- но при этом (и это хорошая новость) область подкачки не используется,
- значит оперативной памяти хватает, но запаса нет. 

Выводы верны и не верны одновременно. Если увеличить общий объём физической памяти на сервере, то запустив систему, в команде top опять увидим похожую картину.

Если смотреть по отдельным процессам, то в этой команде для нас представляют интерес следующие столбцы:
  • VIRT (virtual size of a process) - общий объем используемой памяти: индивидуальная память процесса плюс память, разделяемая с другими процессами, плюс файлы на диске, которые отображаются в память, плюс библиотеки и так далее. Можно сказать, что это максимально доступный процессу объём памяти, 
  • RES (resident size) - указывает точно сколько в действительности потребляет процесс реальной физической памяти (совпадает со значением в колонке %MEM),
  • SHR (shared) - определяет размер разделяемой памяти.

В случае с процессами Oracle в моём примере (рис. 1) в поле VIRT отображается вся память, выделенная на буферы СУБД (SGA) (рис. 2).

Рис. 2. Размер SGA области текущего экземпляра Oracle.

Двигаемся дальше. Следующая команда free - служит для вывода информации об использовании оперативной памяти сервера, опять же, с областью подкачки (swap) (рис. 3).

Рис. 3. Пример вывода команды free на сервере с Linux.

По умолчанию, команда выводит информацию в килобайтах, для вывода в байтах или мегабайтах можно использовать соответствующие ключи -b и -m (рис. 4). 

Рис. 4. Пример вывода команды free в мегабайтах на сервере с Linux.

Теперь значения полностью совпадают с выводом команды top, но мы получили немного больше информации. Во-первых, появился ещё один столбец "cached", в котором отображается 179 187 Мб памяти. А во-вторых, поле "-/+ buffers/cache" указывает сколько реально памяти сейчас используют приложения (11 068 Мб) и сколько им ещё может быть выделено системой (182 642 Мб).

Обе вышеописанные команды используют информацию из файла meminfo, который хранится в псевдо (dummy) файловой системе /proc. Данная файловая система не существует на самом деле, а предоставляет интерфейс к структурам данных в ядре Linux. Найти её можно в выводе команды df -a (рис. 5).

Рис. 5. Файловая система proc.

Для просмотра информации из ядра Linux по использованию памяти можно прочитать содержимое файла напрямую, выполнив команду cat /proc/meminfo (рис. 6).

Рис. 6. Пример содержимого файла meminfo.

Вот теперь мы добрались до максимальной глубины картины по использованию оперативной памяти операционной системой Linux. Давайте разбираться. 

В приведённом примере на сервере всего доступно 192 Гб оперативной памяти (MemTotal), никак не используется приложениями и операционной системой - 741 Мб (MemFree). Для буферов операционной системы выделено 2 833 480 Кб памяти. Буферы используются для кэширования, например, таблиц файловых дескрипторов (i-node table) или записей директорий (dentry), то есть мета-данных файловых систем. А самым большим потребителем "не используемой" памяти является страничный кэш (Cached). Как я уже говорил выше, Linux не будет просто так держать большой объём оперативной памяти свободной. Каждый раз, когда выполняется операция чтения из файла (read ()), расположенного на диске, данные считываются в эту область памяти страничного кэша. Как только операция чтения завершается, ядро Linux не выбрасывает страницу памяти, а использует её при повторном чтении той же самой части файла. Этот механизм здорово сокращает количество обращений к диску. Но при этом эта память может быть быстро освобождена и передана ядру операционной системы или приложениям в случае такого запроса. Это как раз и указано в выводе команды free  в строке "-/+ buffers/cache" в поле free). 

Ещё один момент, который стоит учитывать при мониторинге. Linux никогда не съедает всю память до конца, то есть вы не увидите 0 Кб в поле MemFree. Операционная система всегда оставляет часть памяти для маневров по освобождению памяти.

Если физической памяти явно не хватает, то начинается активное использование области подкачки (swap). Немного swap области может использоваться и при большом количестве свободной оперативной памяти Например, в моём примере этим занято 21 Мб (рис. 4). Ядро операционной системы может скинуть часть страниц памяти, к которым очень-очень редко происходит обращение. Главное, чтобы не было активного использования области подкачки. Для обнаружения этого в системе можно обратиться к команде vmstat (рис. 7).

Рис. 7. Пример вывода команды vmstat в Linux.

Используемые в данном варианте параметры:
- "-S M" - отображать результаты в мегабайтах,
- "2 5" - вывести 5 слепков состояния с интервалом в 2 секунды.

В выводе можно увидеть статистику использования оперативной памяти - поля swpd, free, buff, cache. А также активность области подкачки - поля swap:si и swap:so, которые показывают ввод-вывод из данной области. В данном примере мы видим, что swap активно не используется.

Так же хочу напомнить, что в SAP системе информацию по использованию оперативной памяти на сервере в виде мгновенного снимка или статистики за предыдущие часы можно получить в транзакции ST06, выбрав пункт "Память" (рис. 8). В принципе, там тоже можно найти основные показатели, о которых я только что рассказал. Это может быть полезно, если у вас нет доступа на уровень операционной системы сервера, где работает SAP система.

Рис. 8. Пример вывода транзакции ST06 для мониторинга использования памяти.

Дополнительную информацию можно найти в этой статье (или прочитать перевод). 




Комментариев нет:

Отправить комментарий