← Назад к вопросам
Что такое виртуальная память и зачем она нужна?
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