← Назад к вопросам

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

2.3 Middle🔥 201 комментариев
#Linux и администрирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Виртуальная память в Linux системах

Виртуальная память - это критически важная концепция для DevOps инженера. Это фундамент для понимания как OS управляет памятью и ресурсами.

Определение

Виртуальная память - это абстракция которая:

  • Позволяет каждому процессу думать что он имеет всю RAM
  • На самом деле часть данных может быть на диске (swap)
  • Создаёт иллюзию больше памяти чем физически есть

Проблема которую она решает

Без виртуальной памяти:
- У тебя есть 16 GB RAM
- Если процесс нужно 20 GB - crash!
- Очень сложно управлять памятью
- Фрагментация памяти

С виртуальной памятью:
- Процесс видит адресное пространство (например, 64-bit)
- Может использовать более 16 GB на диске (swap)
- OS автоматически управляет physical vs virtual
- Проблема решена!

Архитектура виртуальной памяти

┌─────────────────────────────────┐
│  Виртуальное адресное пространство (64-bit)
│  0x00000000 - 0xFFFFFFFFFFFFFFFF│
│                                  │
│  Kernel space (верхняя половина) │
│  ┌─────────────────────────────┐ │
│  │ Kernel code & data          │ │
│  │ Page tables                 │ │
│  └─────────────────────────────┘ │
│                                  │
│  User space (нижняя половина)    │
│  ┌─────────────────────────────┐ │
│  │ Stack                       │ │
│  ├─────────────────────────────┤ │
│  │ (unused)                    │ │
│  ├─────────────────────────────┤ │
│  │ Heap                        │ │
│  ├─────────────────────────────┤ │
│  │ Data (initialized)          │ │
│  ├─────────────────────────────┤ │
│  │ Code (BSS)                  │ │
│  └─────────────────────────────┘ │
└─────────────────────────────────┘
         ↓ (MMU translation)
┌─────────────────────────────────┐
│ Физическая RAM (16 GB)          │
│ Page 0  → Physical address      │
│ Page 1  → Physical address      │
│ ...                             │
└─────────────────────────────────┘
         + Swap on disk (если нужен)

Как работает виртуальная память

1. Pages и Page Table

Виртуальная память разбита на pages (обычно 4 KB)
Каждый page может быть:
- В physical RAM
- На диске (swap)
- Не allocated

Page table - это mapping: virtual page → physical page

2. Page Fault

Процесс обращается к адресу:
1. MMU (Memory Management Unit) проверяет page table
2. Если page в RAM - OK, очень быстро
3. Если page на диске (swap) - PAGE FAULT
4. OS загружает page с диска в RAM
5. Возможно выгружает другой page на диск
6. Process продолжает

Это называется "demand paging"

Физическая vs Виртуальная память

# Проверить физическую RAM
free -h
              total        used        free      shared  buff/cache   available
Mem:           15Gi        8.5Gi       1.2Gi     200Mi       5.8Gi       6.2Gi
Swap:          8.0Gi       2.3Gi       5.7Gi

# Проверить виртуальную память процесса
ps aux | grep python
USER  PID  %CPU %MEM  VSZ   RSS
user  1234 15.2 25.6  3.2G  2.8G
     ↑ Виртуальная ↑ Физическая (RSS)

# Детальная информация
cat /proc/1234/status
VmPeak: 3358572 kB  (максимум VSZ)
VmSize: 3358572 kB  (текущий VSZ)
VmRSS:  2883480 kB  (текущий RSS)
VmSwap: 100000 kB   (в swap'е)

Swap пространство

Что это:

  • Место на диске которое используется как "расширение" RAM
  • Медленнее чем RAM (диск vs память)
  • Критично для stability когда мало physical памяти

Создать swap:

# Создать swap файл (4 GB)
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# Проверить
free -h
cat /proc/swaps

# Добавить в /etc/fstab для persistence
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Swappiness (агрессивность свап'а)

# Проверить текущее значение
cat /proc/sys/vm/swappiness
# Значение 60 (default)

# Значения:
# 0: использовать swap только в крайних случаях
# 10-20: умеренное использование
# 100: агрессивное использование

# Изменить
sudo sysctl vm.swappiness=10

# Permanent
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Practical примеры

Пример 1: Процесс большой объём памяти

# Python скрипт который использует 10GB памяти
import numpy as np

# Создать большой array (10GB)
data = np.zeros((10**9, 8), dtype=np.float64)  # ~8GB
process_data(data)
# Запустить
python big_script.py

# Мониторить
watch -n 1 'free -h && echo "---" && ps aux | grep python'

# Система:
# - Если RAM < 10GB
# - Page fault'ы
# - Данные выгружаются на swap
# - МЕДЛЕННЕЕ, но не crash

Пример 2: OOM Killer

# Если памяти вообще нет
# Linux включает OOM Killer
# Убивает самый "bad" процесс

# Проверить логи
journalctl -u kernel -n 20
grep -i 'out of memory' /var/log/syslog

# Контролировать oom_score
cat /proc/[PID]/oom_score
cat /proc/[PID]/oom_score_adj

# Защитить важный процесс
echo -100 > /proc/[PID]/oom_score_adj  # Менее вероятно быть убитым

Debugging и мониторинг

# Посмотреть детали памяти
cat /proc/meminfo
MemTotal:       16428916 kB
MemFree:         1269840 kB
MemAvailable:    6573200 kB
Buffers:          453268 kB
Cached:          5168972 kB
SwapTotal:       8388604 kB
SwapFree:        5794444 kB

# Page faults (проблемы с памятью)
ps aux | awk '{print $6}' | sort -n | tail -10  # RSS
grepe page-faults /proc/[PID]/stat

# Использование памяти по процессам
ps aux --sort=-%mem | head -10

# Реальное использование swap
for f in /proc/*/; do awk '/VmSwap/ {print "$f " $2}' $f/status; done | sort -k2 -n

Best Practices для DevOps

Мониторить swap usage

  • Высокое использование swap = проблема
  • Означает недостаточно RAM

Настроить swappiness

  • Production: vm.swappiness=10
  • Уменьшает зависимость от swap

Правильный размер swap

  • Не слишком большой (трата диска)
  • Не слишком маленький (нестабильность)
  • Обычно: RAM/2 или RAM*2

OOM Killer защита

  • Не давать убивать критичные процессы
  • memory.limit_in_bytes в cgroups (Docker)

Мониторить page faults

  • Много page faults = медленность
  • Нужна больше RAM

В контексте контейнеров

# Docker - ограничить память
docker run -m 1g --memory-swap 2g image

# Kubernetes - limits and requests
resources:
  requests:
    memory: "512Mi"
  limits:
    memory: "1Gi"

# Cgroups контролируют виртуальную память
cat /sys/fs/cgroup/memory/docker/[container-id]/memory.limit_in_bytes

Выводы

Виртуальная память:

  • Абстракция которая позволяет процессам использовать больше памяти
  • Переносит часть данных на диск (swap)
  • Медленнее чем физическая RAM
  • Критична для stability

Для DevOps:

  • Мониторить swap usage
  • Настроить swappiness
  • Обеспечивать достаточно physical памяти
  • Защищать критичные процессы от OOM Killer