Глава 3: Анализ памяти — Глубокое погружение
Обзор
Память — самый непонятый ресурс. «90% памяти использовано» не значит, что серверу нужно больше RAM — скорее всего, это кэш.
Функции
| Функция | Что делает | Источник |
|---|---|---|
parseMeminfo() |
TotalBytes, FreeBytes, AvailableBytes, CachedBytes, Swap, Dirty, HugePages | /proc/meminfo |
parseVmstat() |
MajorFaults и MinorFaults | /proc/vmstat |
parsePSI() |
Давление памяти (some/full avg10/60) | /proc/pressure/memory |
parseBuddyinfo() |
Фрагментация по зонам и ордерам | /proc/buddyinfo |
parseNUMAStats() |
Per-NUMA-node память + numa_hit/miss | /sys/devices/system/node/ |
Анализ эффективности кэша (Tier 2)
Метрики /proc/meminfo показывают только размер кэша, но не его эффективность.
cachestat
Показывает соотношение hits/misses для page cache. - Hits: Чтения из памяти (быстро). - Misses: Чтения с диска (медленно). - Полезно для: Понимания, нужно ли увеличивать RAM для базы данных. Если misses > 20% при активной нагрузке — кэш не справляется.
MemFree vs MemAvailable
- MemFree: Полностью неиспользуемые страницы. Часто близко к нулю — и это нормально!
- MemAvailable: Free + кэш + буферы, которые можно освободить. Это реально доступная память.
Правило: Используйте MemAvailable, а не MemFree, для планирования мощности.
Page Faults
- Minor fault: Страница не в таблице страниц, но ЕСТЬ в памяти. Стоимость: ~1μs.
- Major fault: Страницы нет в памяти, нужно читать с диска. Стоимость: ~1-10ms.
Sysctl параметры
| Параметр | По умолчанию | Значение |
|---|---|---|
vm.swappiness |
60 | Агрессивность подкачки (0=избегать, 100=агрессивно) |
vm.overcommit_memory |
0 | 0=эвристика, 1=всегда разрешать, 2=строгий учёт |
vm.dirty_ratio |
20 | % RAM для грязных страниц до синхронной записи |
Примеры диагностики
Здоровый сервер
Available = 66% от total. Нулевой swap. Нет давления.
Утечка памяти
Available < 2%, кэш вытеснен, swap активно используется, 125K major faults, PSI some=32%.