Что означает столбец VIRT в htop?

«Что означает столбец VIRT в htop?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

VIRT в htoptop) отображает общий объем виртуальной памяти, выделенной ядром для процесса. Это не потребление физической RAM, а полный адресное пространство, которое процесс может использовать.

Что входит в VIRT:

  1. Код программы (библиотеки, исполняемый файл).
  2. Данные в оперативной памяти (стек, куча).
  3. Общие библиотеки, отображенные в память (загруженные один раз, но учтенные в VIRT каждого использующего их процесса).
  4. Файлы, отображенные в память через mmap() (например, большие файлы данных).
  5. Зарезервированная, но еще не использованная память (например, большой malloc, который не был записан).
  6. Память в swap-разделе.

Почему это важно для DevOps:

  • Диагностика утечек памяти: Резкий рост VIRT может указывать на неконтролируемое выделение адресного пространства, даже если RES (физическая память) растет медленно.
  • Планирование ресурсов: Высокий VIRT у многих процессов может указывать на необходимость увеличения swap-пространства или настройки лимитов (ulimit -v).
  • Понимание реального потребления: VIRT часто сильно завышен. Ключевой метрикой для мониторинга и алертинга является RES (Resident Set Size) — фактически используемая физическая RAM.

Пример анализа в htop:

PID USER      VIRT   RES   SHR  CPU% MEM%   TIME+  Command
4567 appuser   2.3G  450M   80M   2.5  5.6  10:20.15  java -Xmx1g -jar app.jar
  • VIRT=2.3G: Java-процессу выделено 2.3 ГБ виртуального адресного пространства (включая JVM, heap, библиотеки).
  • RES=450M: Фактически в RAM используется только 450 МБ.
  • SHR=80M: 80 МБ из RES — это общие библиотеки, которые могут использоваться другими процессами.

Связь с контейнерами: Внутри контейнера утилиты типа htop показывают память с точки зрения хостовой ОС. Для контроля памяти контейнера используются лимиты cgroups, которые задаются через docker run -m или в спецификации Kubernetes Pod (resources.limits.memory).