Что такое виртуальная память в Linux и зачем она нужна?

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

Ответ

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

Основные цели и преимущества:

  1. Изоляция и безопасность: Процессы не могут напрямую обращаться к памяти друг друга или к памяти ядра. Это предотвращает случайную или злонамеренную порчу данных.
  2. Абстракция и упрощение программирования: Программа работает с виртуальными адресами (например, от 0x0 до 0xffff...). Ядро и аппаратура (MMU — Memory Management Unit) через таблицы страниц (page tables) транслируют эти адреса в реальные физические. Программисту не нужно заботиться о реальном расположении данных в RAM.
  3. Расширение доступной памяти (своппинг): Ядро может перемещать редко используемые «страницы» памяти (обычно по 4 КБ) из RAM на специальный раздел диска — swap. Это позволяет системе запускать процессы, суммарный объём памяти которых превышает размер физической RAM.
  4. Эффективное использование памяти: Механизмы, такие как Copy-on-Write (CoW), позволяют нескольким процессам (например, после fork()) безопасно использовать одни и те же страницы памяти до момента записи, экономя ресурсы.

С точки зрения DevOps/администрирования:

  • Мониторинг: Ключевые метрики — free -h, vmstat, sar -r. Важно следить за swappiness и использованием swap-раздела. Высокая активность swap (si/so в vmstat) указывает на нехватку RAM и ведёт к резкому падению производительности ("thrashing").
  • Настройка: Параметр ядра vm.swappiness (от 0 до 100) регулирует склонность системы к использованию swap. Для серверов с SSD часто рекомендуют низкие значения (1-10).
  • Out-of-Memory (OOM): Когда физическая память и swap исчерпаны, OOM-killer принудительно завершает процессы для освобождения памяти.

Пример проверки использования памяти процесса:

# Показать виртуальную (VSZ) и резидентную (RSS) память процесса
$ ps aux | grep nginx
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1234  0.0  0.1  123456  7890 ?        Ss   10:00   0:00 nginx: master process

# VSZ (Virtual Memory Size) — всё виртуальное адресное пространство процесса.
# RSS (Resident Set Size) — часть памяти процесса, которая реально находится в RAM.