Команди и инструменти за проверка на консумацията на RAM в Linux
Мониторингът на RAM използването в Linux означава заявяване на подсистемата за памет на ядрото за извличане на метрики за разпределение на физическата памет, използване на swap и размери на резидентния набор за всеки процес. Най-преките методи използват вградени помощни програми — free, top, htop, ps, vmstat и smem — всяка от които разкрива различен слой от йерархията на паметта, от общите стойности за цялата система до пропорционалния размер на набора (PSS) за всеки процес.
Прекомерното натоварване на паметта задейства Linux убиеца при изчерпване на паметта (OOM), който принудително прекратява процеси, за да освободи RAM. Разбирането кои команди разкриват кои метрики — и какво всъщност означават тези метрики — е разликата между реактивно справяне с проблеми и проактивно управление на капацитета. Това ръководство обхваща всеки основен инструмент, изходните данни на ядрото, от които те четат, и граничните случаи, които изненадват дори опитни администратори.
Защо мониторингът на RAM е важен на Linux сървъри
Управлението на паметта в Linux е умишлено агресивно. Ядрото използва цялата налична RAM като кеш на страници за ускоряване на дисковия I/O, което означава, че система, отчитаща почти нулева свободна памет, не е непременно под натоварване — тя може просто да кешира ефективно. Погрешното тълкуване на това поведение е една от най-честите грешки при интерпретиране на необработени стойности за памет.
Основни причини за непрекъснат мониторинг на RAM:
- Предотвратяване на OOM убиеца: Идентифицирайте процеси, консумиращи много памет, преди ядрото да прекрати критични услуги.
- Откриване на използване на swap: Интензивната swap активност (суапване) показва изчерпване на RAM и причинява сериозна I/O латентност.
- Диагностика на изтичане на памет: Процеси с постоянно нарастващ RSS с течение на времето сигнализират за изтичания на ниво приложение.
- Планиране на капацитета: Данните за тенденциите информират решенията за вертикално мащабиране или преразпределение на натоварването.
- Настройка на производителността: Регулирането на
vm.swappiness, огромни страници и NUMA топология изисква базови данни за паметта.
В среда за VPS Хостинг, където ресурсите се споделят или са ограничени от лимитите на хипервайзора, точният мониторинг на RAM е особено критичен — достигането на таван на паметта безшумно влошава производителността, преди да се задейства каквото и да е предупреждение.
Разбиране на терминологията за памет в Linux
Преди да изпълните каквато и да е команда, трябва да разберете какво всъщност представляват изходните колони.
| Термин | Определение |
|---|---|
| Total | Инсталирана физическа RAM (или разпределена на виртуалната машина) |
| Used | Памет, активно консумирана от процеси и структури на ядрото |
| Free | Напълно неизползвана RAM — често подвеждащо ниска |
| Shared | Памет, използвана от tmpfs и споделена между процеси |
| Buff/Cache | Буфери на ядрото и кеш на страници — може да бъде освободена при поискване |
| Available | Реалистична оценка на RAM, налична за нови разпределения без суапване |
| Swap Used | Данни, изместени от RAM към swap дяла или swap файла |
| VSZ (Virtual Size) | Общото виртуално адресно пространство, запазено от процес |
| RSS (Resident Set Size) | Физическа RAM, заета в момента от процес |
| PSS (Proportional Set Size) | RSS, коригиран за споделена памет — най-точната метрика за всеки процес |
| USS (Unique Set Size) | Памет, притежавана изключително от процес; напълно освободена при излизане |
Критично прозрение: Винаги използвайте колоната Available от free -h, а не колоната Free, когато оценявате дали системата има достатъчно RAM за ново натоварване. Колоната Free игнорира освобождаемия кеш, което води до фалшиви аларми.
Файлът /proc/meminfo: Авторитетният източник
Всеки инструмент, описан в тази статия, чете от /proc/meminfo, виртуален файл, поддържан от ядрото в реално време. Директното му инспектиране ви дава най-детайлните налични данни:
cat /proc/meminfoКлючови полета за наблюдение:
MemTotal— обща използваема RAMMemFree— напълно неактивна RAMMemAvailable— прогнозна налична RAM за нови процесиBuffers— суров кеш на дискови блоковеCached— кеш на страници за файловеSwapTotal/SwapFree— капацитет и наличност на swapDirty— памет, чакаща да бъде записана на диск (високите стойности показват I/O натоварване)HugePages_Total/HugePages_Free— статус на разпределение на огромни странициSlab— кеш на структури от данни на ядрото (може да нарасне значително на натоварени NFS или сървъри за бази данни)
Разбирането на /proc/meminfo ви позволява да интерпретирате изхода на всеки друг инструмент с пълен контекст.
Проверка на RAM с командата free
free е най-бързият начин за получаване на снимка на паметта за цялата система. Чете директно от /proc/meminfo и форматира изхода в таблица, четима от човек.
Основна употреба
freeИзходът е в килобайти по подразбиране. Използвайте флагове за по-четими формати:
free -h # Human-readable (MB/GB)
free -m # Output in megabytes
free -g # Output in gigabytes
free -s 5 # Refresh every 5 seconds (continuous monitoring)
free -h --si # Use SI units (1000-based) instead of binary (1024-based)Обяснение на примерния изход
total used free shared buff/cache available
Mem: 15Gi 4.2Gi 1.1Gi 312Mi 9.8Gi 10.9Gi
Swap: 2.0Gi 128Mi 1.9GiВ този пример системата изглежда, че има само 1,1 GB свободна памет, но 10,9 GB всъщност са налични за нови процеси, тъй като ядрото ще освободи buff/cache при поискване. Това е най-важното нещо, което трябва да разберете за изхода на free.
Граничен случай: Използването на swap като предупредителен сигнал
Дори малко количество използване на swap (Swap: used > 0) на производствен сървър заслужава разследване. Това означава, че ядрото вече е решило, че някои страници с памет се съхраняват по-добре на диск, отколкото в RAM — знак, че работният набор надвишава физическата памет.
Проверка на RAM с командата top
top предоставя непрекъснато актуализиран изглед в реално време на използването на системните ресурси, комбинирайки статистики за CPU и памет с класиран списък на процесите.
topКлючови полета за памет в top
В горната част на интерфейса на top два реда показват статистики за паметта:
MiB Mem : 16384.0 total, 1126.4 free, 4301.2 used, 10956.4 buff/cache
MiB Swap: 2048.0 total, 1920.0 free, 128.0 used. 11200.0 avail MemВ таблицата с процеси най-релевантните колони за памет са:
- VIRT — размер на виртуалната памет (еквивалент на VSZ)
- RES — резидентна физическа памет (RSS)
- SHR — споделена част от паметта на RES
- %MEM — процент от общата физическа RAM, използвана
Полезни интерактивни команди на top
| Клавиш | Действие |
|---|---|
M | Сортиране на процесите по използване на паметта (%MEM) |
P | Сортиране по използване на CPU |
k | Прекратяване на процес по PID |
1 | Превключване на статистики за всяко CPU ядро |
f | Добавяне/премахване на полета за показване |
W | Запазване на текущата конфигурация |
Изпълнение на top неинтерактивно
За скриптиране и запис на журнали, изпълнете top в пакетен режим:
top -b -n 1 | head -30Това извежда единична снимка — полезна за скриптове за мониторинг, базирани на cron.
Проверка на RAM с htop
htop е подобрен, базиран на ncurses преглед на процеси, който представя същите основни данни като top със значително по-удобен интерфейс. Не е инсталиран по подразбиране на повечето дистрибуции.
Инсталация
# Debian / Ubuntu
apt-get install htop
# RHEL / CentOS / AlmaLinux / Rocky Linux
yum install htop
# or on newer versions:
dnf install htop
# Alpine Linux
apk add htopКакво добавя htop спрямо top
- Цветово кодирани ленти за памет, разграничаващи използваната памет, буферите и кеша с един поглед
- Хоризонтален и вертикален изглед на дървото на процесите (
F5) - Поддръжка на мишка за кликване и превъртане
- Множествен избор за групово управление на процеси
- Вградено търсене (
F3) и филтриране (F4) без запомняне на клавишни комбинации - Директно показване на наличната памет на видно място в заглавката
Легенда на цветовете на лентата за памет в htop
| Цвят | Значение |
|---|---|
| Зелен | Използвана памет (процеси) |
| Син | Буферен кеш |
| Жълт/Оранжев | Кеш на страници |
| Червен | Използван swap |
Професионален съвет: В htop, натиснете F2 (Настройки) > Опции за показване > активирайте „Показване на честотата на CPU” и „Подробно CPU време” за по-пълна картина заедно с данните за паметта.
Проверка на RAM с командата ps
ps (статус на процеса) заявява таблицата на процесите на ядрото и може да бъде сортиран и филтриран за идентифициране на най-големите консуматори на памет в даден момент.
Сортиране на процесите по консумация на памет
ps aux --sort=-%memОбяснение на изходните колони
| Колона | Описание |
|---|---|
USER | Собственик на процеса |
PID | Идентификатор на процеса |
%CPU | Използване на CPU от стартирането на процеса |
%MEM | Процент от използваната физическа RAM (RSS / MemTotal) |
VSZ | Размер на виртуалната памет в KB |
RSS | Размер на резидентния набор в KB |
TTY | Управляващ терминал |
STAT | Състояние на процеса (S=спящ, R=изпълняващ се, Z=зомби, D=неприекъсваемо чакане) |
START | Час на стартиране на процеса |
TIME | Кумулативно консумирано CPU време |
COMMAND | Име и аргументи на командата |
Практични едноредови команди
Показване на топ 10 процеси, консумиращи памет, с четим от човек изход:
ps aux --sort=-%mem | head -11Показване на използването на паметта за конкретно име на процес (напр. Apache):
ps aux | grep apache2 | awk '{sum += $6} END {print sum/1024 " MB"}'Това сумира RSS стойностите на всички работни процеси на apache2 — критично за разбирането на истинския отпечатък на многопроцесни уеб сървъри.
Важна забележка: ps показва RSS, което двойно брои споделените библиотеки. Ако 20 работника на Apache всеки картографира същата 50 MB споделена библиотека, ps отчита 1 000 MB използване на споделена библиотека за тях, докато действителната физическа цена е само 50 MB. Използвайте smem за точно отчитане.
Проверка на RAM с smem
smem е най-точният инструмент за отчитане на паметта за всеки процес, наличен в Linux, тъй като отчита PSS (Пропорционален размер на набора) — споделената памет се разделя пропорционално между всички процеси, които я картографират, елиминирайки проблема с двойното броене, присъщ на инструментите, базирани на RSS.
Инсталация
# Ubuntu / Debian
apt-get install smem
# CentOS / RHEL 7
yum install smem
# RHEL 8+ / AlmaLinux / Rocky Linux
dnf install smem
# Alternatively, install via pip
pip install smemОсновна употреба
smemПолезни опции на smem
smem -r # Sort by RSS (descending)
smem -s pss -r # Sort by PSS (most accurate, descending)
smem -u # Aggregate by user
smem -m # Show system-wide memory map
smem -p # Show percentages instead of raw KB
smem -k # Show values in KB
smem -t # Show totals row
smem --pie name # Generate a pie chart (requires matplotlib)
smem -P apache2 # Filter by process name patternPSS срещу RSS: Защо е важно
Разгледайте сървър, изпълняващ 10 работни процеса на Node.js, всеки споделящ 100 MB библиотека на V8 runtime:
- RSS на процес: 200 MB (100 MB споделена + 100 MB частна)
- Общо отчетен RSS: 2 000 MB
- PSS на процес: 110 MB (10 MB дял от 100 MB + 100 MB частна)
- Общо отчетен PSS: 1 100 MB
- Действително използвана физическа RAM: 1 100 MB
RSS надценява използването с почти 2 пъти в този сценарий. При вземане на решения за мащабиране на Dedicated сървър, използването на PSS от smem ви дава истинската картина.
Проверка на RAM с vmstat
vmstat (статистики за виртуална памет) предоставя по-широк изглед на паметта, swap, I/O и CPU активността, което го прави идеален за диагностициране на натоварване на паметта в цялата система, а не на проблеми с отделни процеси.
vmstat 2 10 # Report every 2 seconds, 10 timesКлючови колони за памет
| Колона | Описание |
|---|---|
swpd | Използвана виртуална памет (swap) |
free | Неактивна памет |
buff | Памет, използвана като буфери |
cache | Памет, използвана като кеш |
si | Памет, суапната от диска (KB/s) |
so | Памет, суапната на диска (KB/s) |
Критичен сигнал: Ненулеви стойности на si (суап-вход) и so (суап-изход) в работещ поток на vmstat показват активно суапване — окончателен знак за изчерпване на паметта. Дори случайни пикове в so могат да причинят пикове на латентност на приложението от стотици милисекунди.
Проверка на RAM с sar (Репортер на системната активност)
sar от пакета sysstat записва исторически данни за паметта, позволявайки ретроспективен анализ — нещо, което инструментите в реално време не могат да предоставят.
Инсталация
apt-get install sysstat # Debian/Ubuntu
yum install sysstat # CentOS/RHELУпотреба
sar -r 1 5 # Memory stats every 1 second, 5 times
sar -r -f /var/log/sysstat/sa$(date +%d) # Today's historical data
sar -S 1 5 # Swap statisticssar е безценен за отговаряне на въпроси като „Имаше ли пик на паметта в 3 часа сутринта, причинил срива на приложението?” — въпрос, на който никой инструмент в реално време не може да отговори след факта.
Проверка на RAM с /proc/<PID>/status и /proc/<PID>/smaps
За задълбочен анализ на всеки процес, ядрото излага подробни карти на паметта директно в /proc.
Бърза проверка на паметта за всеки процес
cat /proc/$(pgrep nginx | head -1)/status | grep -E "VmRSS|VmPeak|VmSize|VmSwap"Пример за изход:
VmPeak: 512340 kB
VmSize: 498120 kB
VmRSS: 102400 kB
VmSwap: 0 kBVmPeak— пиков размер на виртуалната памет, достигнат някога от този процесVmRSS— текущ размер на резидентния наборVmSwap— колко от този процес е суапнато
Подробна карта на паметта с smaps
cat /proc/$(pgrep mysql | head -1)/smaps | grep -E "^(Size|Rss|Pss|Shared|Private)"Това разкрива всяко картографиране на паметта (heap, stack, споделени библиотеки, анонимни картографирания) с индивидуални RSS и PSS стойности — най-детайлният изглед на паметта, наличен без профайлър.
Сравнение на инструментите: Избор на правилната команда
| Инструмент | Обхват | Тип метрика | В реално време | Исторически | Точност на споделена памет | Най-добър случай на употреба |
|---|---|---|---|---|---|---|
free | За цялата система | Total/Available | Да | Не | Н/П | Бърза проверка на здравето |
top | За всеки процес + система | RSS, %MEM | Да | Не | Ниска (RSS) | Интерактивен мониторинг |
htop | За всеки процес + система | RSS, %MEM | Да | Не | Ниска (RSS) | Интерактивен мониторинг (предпочитан) |
ps | За всеки процес | RSS, VSZ | Снимка | Не | Ниска (RSS) | Скриптиране, сортиране |
smem | За всеки процес | PSS, USS, RSS | Снимка | Не | Висока (PSS) | Точно отчитане на паметта |
vmstat | За цялата система | Swap I/O, free | Да | Не | Н/П | Диагностициране на натоварване на swap |
sar | За цялата система | Всички метрики | Не | Да | Н/П | Анализ след инцидент |
/proc/meminfo | За цялата система | Необработени данни на ядрото | Да | Не | Н/П | Скриптиране, автоматизация |
/proc/PID/smaps | За всеки процес | Пълна карта | Да | Не | Висока | Задълбочено профилиране на процеси |
Практически работни процеси за мониторинг
Работен процес 1: Бърза триаж (под 60 секунди)
free -h # Step 1: Is Available memory critically low?
vmstat 1 5 # Step 2: Is active swapping occurring?
ps aux --sort=-%mem | head -15 # Step 3: Which processes are the top consumers?Работен процес 2: Идентифициране на изтичане на памет
# Watch a specific process's RSS grow over time
watch -n 5 'ps -o pid,rss,vsz,comm -p $(pgrep your_app)'
# Or use smem with repeated snapshots
while true; do smem -P your_app -t; sleep 30; doneРаботен процес 3: Исторически анализ след инцидент
sar -r -f /var/log/sysstat/sa$(date +%d --date='yesterday')Работен процес 4: Скрипт за автоматизирано предупреждение
#!/bin/bash
THRESHOLD=90
USED_PCT=$(free | awk '/^Mem:/ {printf "%.0f", $3/$2 * 100}')
if [ "$USED_PCT" -gt "$THRESHOLD" ]; then
echo "ALERT: RAM usage at ${USED_PCT}% on $(hostname)" | mail -s "Memory Alert" admin@example.com
fiТози скрипт може да бъде поставен в cron задача за непрекъснат автоматизиран мониторинг — практическа необходимост на всеки производствен VPS с cPanel или сървър на голо желязо.
Разширено: Параметри за настройка на паметта на ядрото
След като сте идентифицирали натоварването на паметта, тези параметри на sysctl директно влияят на поведението:
# View current swappiness (default: 60)
sysctl vm.swappiness
# Reduce swap tendency (recommended for databases: 10)
sysctl -w vm.swappiness=10
# Increase dirty page write-back aggressiveness
sysctl -w vm.dirty_ratio=15
sysctl -w vm.dirty_background_ratio=5
# Drop page cache manually (use with caution on production)
sync; echo 3 > /proc/sys/vm/drop_cachesОбяснение на vm.swappiness: Стойност от 60 означава, че ядрото ще започне суапване, когато RAM е 40% използвана. За сървъри за бази данни (MySQL, PostgreSQL, Redis), задаването на 10 поддържа данните в RAM много по-дълго, драстично намалявайки I/O латентността. За настолни системи или системи с ограничена RAM, стойността по подразбиране е по-подходяща.
Чести клопки и погрешни интерпретации
Клопка 1: Паника заради ниска „свободна” памет
Както беше обяснено по-рано, Linux умишлено използва свободната RAM като кеш. Система с 200 MB свободна, но 8 GB налична памет е здрава. Винаги четете колоната Available.
Клопка 2: Сумиране на RSS за оценка на общото използване на паметта
Сумирането на RSS стойностите на ps за всички процеси обикновено ще надвиши общата физическа RAM поради двойното броене на споделените библиотеки. Използвайте smem -t за точна системна сума.
Клопка 3: Игнориране на Slab кеша
На натоварени NFS клиенти или сървъри с много малки файлове, Slab разпределителят на ядрото може да консумира гигабайти RAM. Проверете cat /proc/meminfo | grep Slab — тази памет е технически освобождаема, но не се появява в инструментите на ниво процес.
Клопка 4: Объркване на VSZ с действителното използване на паметта
Java приложение може да показва 4 GB VSZ, но само 512 MB RSS. VSZ включва картографирани файлове с памет, запазен, но неразпределен heap и споделени библиотеки — повечето от които никога не се зареждат в физическата RAM.
Клопка 5: Пренебрегване на паметта при контейнеризирани натоварвания
Вътре в Docker контейнер, free показва общата памет на хоста, а не лимита на cgroup на контейнера. Използвайте cat /sys/fs/cgroup/memory/memory.usage_in_bytes и cat /sys/fs/cgroup/memory/memory.limit_in_bytes за точни метрики на ниво контейнер.
Настройване на постоянен мониторинг на RAM
За производствени среди, командите в определен момент от времето са недостатъчни. Разгледайте тези подходи за непрекъсната видимост:
sysstatс cron: Активира автоматично събиране на исторически данни отsar.- Prometheus + Node Exporter: Събира метрики от
/proc/meminfoи ги излага за табла на Grafana. - Netdata: Мониторинг в реално време с нулева конфигурация с гранулярност от секунда и вградено откриване на аномалии в паметта.
- Zabbix или Nagios: Предупреждения от корпоративен клас с конфигурируеми прагове за памет и политики за ескалация.
При изпълнение на натоварвания на инфраструктура за GPU Хостинг, наблюдавайте и GPU VRAM заедно със системната RAM — nvidia-smi --query-gpu=memory.used,memory.free --format=csv предоставя еквивалентните метрики за GPU памет.
За уеб хостинг среди, управлявани чрез VPS контролни панели, повечето панели включват вградени графики за памет — но те обикновено правят запитвания на интервали от 1–5 минути и ще пропуснат краткотрайни пикове, които vmstat или sar биха уловили.
Техническа матрица за решения: Кой инструмент да използвате кога
| Сценарий | Препоръчан инструмент | Команда | |
|---|---|---|---|
| Бърза проверка на здравето на системата | free | free -h | |
| Намиране на най-големите консуматори на памет в момента | ps или htop | `ps aux –sort=-%mem | head -15` |
| Точно отчитане за всеки процес | smem | smem -s pss -r | |
| Диагностициране на активно суапване | vmstat | vmstat 1 10 | |
| Разследване на минал инцидент с паметта | sar | sar -r -f /var/log/sysstat/saDD | |
| Задълбочено профилиране на конкретен процес | /proc/PID/smaps | cat /proc/PID/smaps | |
| Непрекъснат производствен мониторинг | Prometheus + Node Exporter | — | |
| Лимити на паметта на контейнера | cgroup filesystem | cat /sys/fs/cgroup/memory/memory.usage_in_bytes |
Контролен списък с ключови изводи
- Винаги проверявайте наличната памет от
free -h, а не колоната Free, за да оцените действителното пространство. - Използвайте
vmstat 1 5, за да потвърдите или изключите активното суапване, преди да ескалирате разследването. - Използвайте
smem -s pss -rвместоps aux --sort=-%mem, когато ви трябват точни данни за паметта за всеки процес — особено на сървъри с много процеси, споделящи библиотеки. - Инсталирайте
sysstatна всеки производствен сървър веднага след осигуряването, за да активирате историческо събиране на данни отsar. - Задайте
vm.swappiness=10постоянно в/etc/sysctl.confна сървъри за бази данни, за да минимизирате използването на swap. - Проверете
/proc/meminfoза стойности наSlabиDirty, когато стандартните инструменти не обясняват наблюдаваното натоварване на паметта. - За контейнеризирани натоварвания, четете cgroup файловете за памет — а не
free— за точни лимити и използване. - В среди за споделен хостинг или VPS, установете базови линии на паметта по време на нормална работа, за да могат аномалиите да бъдат незабавно разпознати.
—
Често задавани въпроси
Каква е разликата между „свободна” и „налична” памет в Linux?
„Свободна” е RAM без никакво текущо използване. „Налична” е реалистичната оценка на паметта, която може да бъде разпределена за нови процеси без задействане на суапване — тя включва освобождаем кеш на страници и буфери. На здрав Linux сървър, „свободната” памет е често близо до нула, докато „наличната” остава висока. Винаги използвайте „налична” за оценки на капацитета.
Защо сумата от всички RSS стойности на процесите надвишава общата физическа RAM?
RSS (Размер на резидентния набор) брои споделената памет — като споделени библиотеки — веднъж за всеки процес, който я картографира. Ако 50 процеса всеки картографира 100 MB споделена библиотека, общата сума на RSS се надува с 4 900 MB над действителната физическа цена. Използвайте smem с PSS отчитане, за да елиминирате това двойно броене.
Как да намеря кой процес е задействал Linux OOM убиеца?
Изпълнете dmesg | grep -i "oom|killed process" или journalctl -k | grep -i oom. Ядрото записва точното име на процеса, PID и статистики за паметта в момента на събитието за убиване, включително oom_score на всички оценени процеси.
Какво показва високото използване на swap и колко сериозно е то?
Устойчивото използване на swap означава, че работният набор на системата надвишава физическата RAM. Ядрото компенсира чрез страниране на данни на диска, което обикновено е 100–1 000 пъти по-бавно от достъпа до RAM. Дори скромна swap активност причинява измеримо забавяне на приложението. Това е окончателен сигнал или за намаляване на консумацията на памет, увеличаване на RAM, или преразпределение на натоварванията.
Мога ли да наблюдавам използването на RAM вътре в Docker контейнер, използвайки стандартни Linux команди?
Стандартни команди като free вътре в контейнер показват общата RAM на хоста, а не лимита на cgroup на контейнера. За точни метрики на ниво контейнер, четете /sys/fs/cgroup/memory/memory.usage_in_bytes за текущото използване и /sys/fs/cgroup/memory/memory.limit_in_bytes за конфигурирания лимит. Алтернативно, използвайте docker stats <container_name> от хоста за форматиран изглед.
