Поиск по сайту:

Легко понять использование оперативной памяти Linux с помощью Smem


Использование памяти в Linux может быть трудно интерпретировать и трудно понять. С помощью smem легко узнать, какую память использует процесс и какие процессы используют больше всего.

Использование памяти

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

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

Ядро и остальная часть операционной системы, среда вашего рабочего стола и каждое приложение или сеанс командной строки, которые вы запускаете, требуют части конечного объема оперативной памяти, установленной на вашем компьютере. Одни процессы порождают другие процессы. Некоторые процессы делят оперативную память с другими процессами.

Пытаясь расшифровать все это и найти простой ответ на вопрос «Сколько оперативной памяти использует эта программа или процесс?» может оказаться неожиданной проблемой. Детализация великолепна и имеет свое место, но в равной степени избыток информации может быть препятствием.

Например, использование cat для просмотра псевдофайловой системы /proc/meminfo вернуло 50 строк вывода на компьютере, который использовался для исследования этой статьи. С чего начать?

cat /proc/meminfo

И некоторые утилиты Linux дают разные ответы. На нашей тестовой машине у нас был запущен экземпляр less с идентификатором процесса 2183.

Мы можем использовать утилиту pmap с параметром -x (расширенный), чтобы получить полную картину использования памяти процессом. Мы будем использовать его с идентификатором процесса нашего экземпляра less:

pmap -x 2183

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

Затем мы использовали утилиту ps с параметром -o (выход), выбрали столбец RSS и передали ему идентификатор процесса того же экземпляр less:

ps -o rss 2183

Получаем другой результат. Это проектное решение авторов ps. Это со страницы ps man:

У авторов других утилит есть свои взгляды на то, как измерять использование оперативной памяти.

RSS, USS и PSS

Размер резидентного набора (RSS) — это объем ОЗУ, выделенный процессу, за исключением пространства подкачки, но включая ОЗУ, необходимое для разделяемых библиотек, которые использует процесс.

RSS почти всегда завышает использование оперативной памяти. Если два или более процессов используют одну или несколько общих библиотек, RSS просто добавит использование ОЗУ каждой библиотекой к своему счетчику использования ОЗУ для каждого из этих процессов. Помимо неточности, в этом есть определенная ирония. Общие библиотеки означают, что каждому процессу не нужно загружать свой собственный частный экземпляр библиотеки. Если библиотека уже находится в памяти, она разделит ее и уменьшит нагрузку на оперативную память.

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

Размер уникального набора — это объем ОЗУ, который используется исключительно процессом, независимо от того, потребляется ли он непосредственно процессом или используется библиотеками, которые используются исключительно процессом. Опять же, он игнорирует пространство подкачки. Его интересует только настоящая физическая оперативная память.

USS и PSS — это термины и понятия, предложенные Мэттом Макколлом, автором smem.

Утилита smem

Утилита smem сообщает об использовании памяти процессами, пользователями, отображением или всей системой. Во всех протестированных нами дистрибутивах он требовал установки. Чтобы установить его в Ubuntu, используйте эту команду:

sudo apt install smem

Чтобы установить smem в Fedora, вам нужно ввести:

sudo dnf install smem

Чтобы установить smem на Manjaro, используйте:

sudo pacman -Sy smem

Использование smem без параметров дает вам список процессов, использующих оперативную память.

smem

В окне терминала отображается таблица информации.

Столбцы:

  • PID: идентификатор процесса, использующего память.
  • Пользователь: имя пользователя, которому принадлежит процесс.
  • Команда: командная строка, которая запустила процесс.
  • Swap: сколько места подкачки использует процесс.
  • USS: размер уникального набора.
  • PSS: пропорциональный размер набора.
  • RSS: размер резидентного набора.

Чтобы увидеть размеры, выраженные в процентах, используйте параметр -p (в процентах).

smem -p

Размеры в байтах заменены процентами.

Чтобы увидеть цифры, представленные в более удобной для человека форме, используйте параметр -k (сокращение). Это уменьшает цифры и добавляет индикаторы единиц измерения.

smem -k

Вместо необработанных байтов размеры отображаются в мегабайтах, гигабайтах и т. д.

Чтобы добавить строку итогов, используйте параметр -t (итоги).

smem -k -t

В последней строке вывода показаны итоги по каждому столбцу.

Уточнение отчета

Вы можете попросить smem сообщить об использовании памяти пользователями, сопоставлением (библиотеками) или всей системой. Чтобы отфильтровать вывод по пользователю, используйте параметр -u (user). Обратите внимание: если вы хотите увидеть больше, чем просто собственное использование, вам нужно запустить smem с sudo.

smem -u
sudo smem -u

Как видите, вывод искажается для имен пользователей длиннее восьми символов.

Чтобы увидеть использование, сопоставленное с используемыми библиотеками, независимо от того, какие процессы используют библиотеки и какие пользователи владеют этими процессами, используйте параметр -m (сопоставление).

smem -m -k -t

Мы также запросили удобочитаемые значения и итог.

Чтобы увидеть использование общесистемной памяти, используйте параметр -w (для всей системы).

smem -w -k -t

Отчетность по отдельной программе

Применив немного магии командной строки, мы можем составить отчет об одной программе и обо всех ее подпроцессах. Мы направим выходные данные из smem в tail  и попросим tail показать только последнюю строку. Мы скажем smem использовать удобочитаемые значения и указать итог. Сумма будет последней строкой, и это строка tail, которая будет отображаться для нас.

Мы воспользуемся параметром -c (columns) с smem и укажем ему, какие столбцы мы хотим включить в наш вывод. Мы ограничим это столбцом Proportional Set Size. Параметр -P (фильтр процесса) позволяет нам указать строку поиска для smem . Будут включены только совпадающие строки вывода.

smem -c pss -P firefox -k -t | tail -n 1

Это быстрый и удобный способ узнать потребление оперативной памяти программой и ее дочерними процессами.

Создание графиков

Вы можете передать параметры --pie или --bar, чтобы smem генерировал графики. Надо сказать, что при слишком большом количестве категорий графики быстро становятся непонятными, но они могут быть полезны для быстрого визуального обзора.

Формат команды:

smem --pie name -s uss

Круговая диаграмма появится в отдельном окне просмотра.

Чтобы увидеть другие графики, используйте pss или rss вместо uss. Чтобы увидеть гистограмму, используйте --bar вместо --pie.

Чтобы это работало, вам необходимо установить Python вместе с библиотекой matplotlib . Они уже были установлены в протестированных нами дистрибутивах Ubuntu, Fedora и Manjaro.

Хорошего по немногу

У утилиты smem есть еще несколько хитростей в рукаве, и вам рекомендуется ознакомиться с ее man страницей. Его основной репертуар — это то, что мы описали здесь, и это отличный небольшой инструмент, который должен быть в вашем наборе инструментов CLI.