- Как в Linux узнать, какой процесс использует всю оперативную память (RAM)?
- Как узнать, сколько свободной памяти в Linux
- Как просмотреть, какая программа потребляет больше всего оперативной памяти в top
- Как найти программы, которые используют больше всего памяти в ps
- Невозможно найти, через какой процесс утекает оперативная память — сумма памяти процессов меньше общей используемой памяти
- Связанные статьи:
- Как узнать потребление памяти процессом в Linux
- Как определить сколько памяти занимает процесс
- Команда ps
- Команда top
- Получение занятой памяти из /proc
Как в Linux узнать, какой процесс использует всю оперативную память (RAM)?
Если в операционной системе заканчивается свободная оперативная память, то это очень сильно влияет на её производительность. Система начинает работать заметно медленнее, уменьшается её «отзывчивость», происходит более долгое переключение между окнами, новые процессы не запускаются или запускаются очень медленно. По этой причине, если какой-то процесс расходует слишком много оперативной памяти или тем более всю свободную оперативную память, не оставляя ресурсов для остальной системы, то необходимо его выявить и принять меры для оптимизации.
Как узнать, сколько свободной памяти в Linux
Начнём с того, что убедимся, что дело действительно в нехватке оперативной памяти, а не в том что, например, центральный процессор слишком загружен. Для этого выполним очень простую команду:
Вы увидите примерно следующее:
- Mem — физическая оперативная память
- Swap — раздел подкачки (если недостаёт оперативной памяти, то система сбрасывает временно неиспользуемые данные на физический диск, а потом по мере необходимости вновь загружает их в оперативную память. С одной стороны, это позволяет продолжить работу в условиях нехватки оперативной памяти, но с другой — система начинает работать заметно медленнее, поскольку физический диск всегда медленнее ОЗУ, плюс нужно время для записи на диск и считывание с диска)
- total — общее количество
- used — используемая в данный момент память (вычисляется как total — free — buffers — cache)
- free — неиспользуемая память
- shared — память, используемая (преимущественно) в tmpfs
- buff — память, используемая буферами ядра
- cache — память, используемая страницами cache и slabs
- buff/cache — сумма буферов и кэша
- available — примерное количество оперативной памяти, доступное для запуска новых приложений без использования ими раздела подкачки. В отличие от поля free, это поле принимает в расчёт страницу cache и также то, что не вся рекуперируемая (пригодная для повторного использования) память будет возвращена для рекуперации из-за того, что элементы используются в данный момент
Итак, если значение поля free, а в особенности поля available очень мало или равно нулю, значит нужно принимать меры, иначе рабочая станция или сервер будут работать крайне медленно либо могут полностью зависнуть.
Как просмотреть, какая программа потребляет больше всего оперативной памяти в top
Очень подробно о команде top, в том числе подсказки и интересные трюки описаны в статье «Как пользоваться командой top для наблюдения за процессами в Linux» — крайне рекомендуется ознакомиться.
По умолчанию программа top сортирует процессы по их нагрузке на центральный процессор. Чтобы посмотреть, по какому полю выполняется сортировка, нажмите клавишу x:
По умолчанию в top отображаются следующие виды памяти:
- VIRT — общее количество используемой задачей виртуальной памяти, включает все коды, данные, совместные библиотеки, плюс страницы, которые были перенесены в раздел подкачки, и страницы, которые были размечены, но не используются
- RES — используемая оперативная память, является подмножеством VIRT, представляет физическую память, не помещённую в раздел подкачки, которую в текущий момент использует задача. Также является суммой полей RSan, RSfd и Rssh.
- SHR — размер совместной памяти, подмножество используемой памяти RES, которая может использоваться другими процессами
- %MEM — доля задачи в использовании памяти (RES)
Для переключения между полями сортировки, используйте < и >. Обратите внимание, что это не курсорные клавиши, а разновидность скобок, для их использования переключитесь на английскую раскладку клавиатуры и нажимайте эти кнопки с зажатой клавишей Shift.
Пример сортировки по %MEM:
Сортировка по VIRT:
Как найти программы, которые используют больше всего памяти в ps
С помощью утилиты ps также можно составить список, отсортированный по количеству потребляемой памяти, для этого выполните:
ps -e -o pid,vsz,comm= | sort -n -k 2
Самые «прожорливые» процессы будут внизу:
Первый столбец — это PID процесса, затем идёт виртуальная память процесса в килобайтах, затем название программы.
Ещё одна элегантная команда с использованием ps:
Невозможно найти, через какой процесс утекает оперативная память — сумма памяти процессов меньше общей используемой памяти
В некоторых версиях ядер Linux присутствовала проблема утечки памяти на уровне ядра, поэтому нет никакой возможности обнаружить её инструментами пользовательского пространства. Пример такого ядра — 3.13.
Причём некоторые ядра допускают утечку памяти только в определённых условиях (пример: Linux Mint 17 при использовании btrfs).
Самым лучшим вариантом в этом случае является обновление ядра и системы в целом до новой версии.
Связанные статьи:
Как узнать потребление памяти процессом в Linux
В Linux потребление памяти процессами измеряется двумя значениями, VSZ и RSS (обе измеряются в байтах).
RSS — переводится как постоянное потребление памяти (Resident Set Size) и показывает сколько в момент вывода команды занято в оперативной памяти.
Также стоит отметить что он показывает весь стёк физически выделенной памяти.
VSZ — виртуальная память (Virtual Memory Size)
Посмотреть список процессов с сортировкой по этим параметрам можно командой:
Для RSS (Resident Set Size):
Для VSZ (Virtual Memory Size):
В зависимости от запущенной команды, результаты вывода будут отображаться в приоритете по занимаему месту процессом в оперативной памяти (RSS)
или количеству занимаемого места в виртуальной памяти (VSZ) в порядке убывания.
$ ps -aux --sort -rss USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND user 30799 51.2 8.1 2733764 285136 ? Rl 09:25 5:30 /usr/lib/chromium-browser/chromium-browser --ppapi-flash-path=/usr/lib/pepperflashplugin-nonfree/libpepflashplayer.so --ppap user 2800 0.1 6.6 9972812 234184 ? Sl окт31 1:26 /usr/bin/plasmashell --shut-up user 31308 2.4 5.3 1767496 188672 ? Sl 09:26 0:13 /usr/lib/chromium-browser/chromium-browser --type=renderer --enable-pinch --field-trial-handle=7228759356551874141,180166971 user 31011 3.9 5.3 1793296 186812 ? Sl 09:25 0:25 /usr/lib/chromium-browser/chromium-browser --type=renderer --enable-pinch --field-trial-handle=7228759356551874141,180166971 user 31369 5.5 4.8 1378568 171328 ? Sl 09:28 0:23 /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe=5 user 14442 12.1 4.2 1050808 150148 ? Sl 01:19 60:04 /usr/lib/x86_64-linux-gnu/libexec/kscreenlocker_greet --graceTime 5000 --ksldfd 26 user 31111 0.9 3.8 1708496 134564 ? Sl 09:25 0:06 /usr/lib/chromium-browser/chromium-browser --type=renderer --enable-pinch --field-trial-handle=7228759356551874141,180166971 user 1225 0.0 3.7 3639148 132092 ? Sl окт31 1:00 /usr/bin/plasmashell --shut-up user 31078 0.6 3.7 1724480 130724 ? Sl 09:25 0:03 /usr/lib/chromium-browser/chromium-browser --type=renderer --enable-pinch --field-trial-handle=7228759356551874141,180166971 user 30986 0.7 3.3 1717860 117660 ? Sl 09:25 0:04 /usr/lib/chromium-browser/chromium-browser --type=renderer --enable-pinch --field-trial-handle=7228759356551874141,180166971 user 1216 1.7 3.2 3271220 113736 ? Sl окт31 20:36 kwin_x11
Важными столбцами являются:
- USER Пользователь, от имени которого работает процесс
- PID Идентификатор процесса
- RSS Физическая память, занятая процессом
- VSZ Виртуальная память
Из примера видно, что большую часть памяти (RSS) занимают процессы браузера chromium.
Как определить сколько памяти занимает процесс
Линукс – довольно гибкая штука и задачи здесь можно выполнить разными способами. Сегодня мы рассмотрим, как узнать сколько ОЗУ используется определенным процессом. Сделаем это на примере процесса веб-сервера apache.
897110 ? S 0:00 /usr/sbin/httpd.itk -k start
Команда ps
Первым вариантом будет команда ps, с помощью которой можно получить список процессов, запущенных на сервере. Командой ps -p
# ps -p 897110 v PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 897110 ? S 0:04 0 342 387153 35176 0.0 /usr/sbin/httpd.itk -k start
ОЗУ будет представлено в процентном соотношении к общему количеству доступной памяти. К сожалению, в данном примере, этот процент крайне мал и столбец %MEM показывает 0,0
Команда top
Второй вариант – использование команды top. Более продвинутые пользователи должны знать эту команду, так как она выводит информацию о нагрузке системы и обновляет ее в реальном времени.
# top -p 897110 top - 16:11:19 up 143 days, 13:09, 1 user, load average: 7.02, 6.89, 6.96 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie Cpu(s): 19.2%us, 4.8%sy, 0.1%ni, 75.3%id, 0.6%wa, 0.0%hi, 0.1%si, 0.0%st Mem: 65773676k total, 42553788k used, 23219888k free, 6596532k buffers Swap: 2097144k total, 0k used, 2097144k free, 27375052k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 897110 root 20 0 378m 34m 500 S 0.0 0.1 0:04.77 httpd.itk
Обратите внимание на столбцы VIRT и %MEM. Последний столбец показывает информацию, которая очень похожа на ту, что получили предыдущей командой. А вот столбец VIRT отображает занятую виртуальную память. Одним словом, виртуальная память – это некая комбинация ОЗУ и свопа, которую использует запущенный процесс.
Получение занятой памяти из /proc
Последней командой для получения занятой процессором памяти будет обращение к псевдо-файловой системе /proc.
# cat /proc/897110/status |grep -i VMSIZE VmSize: 387496 kB
Снова будет выведен результат схожий с уже полученным ранее – виртуальная память, используемая процессом веб-сервера apache. Вот мы и разобрали на примере процесса apache способы, которыми можно посмотреть занимаемую память. Также в тексте я упомянул виртуальную память. О ней мы поговорим в следующий раз.