Решил поделиться с вами, а заодно и разобрать работу одной консольной команды в linux, которая позволяет быстро посмотреть, кто занимает оперативную память на сервере. Сразу предупреждаю, что тема с памятью в linux очень замороченная. Ее нельзя просто взять, посмотреть и все понять :)
Если захотите разобраться в этом вопросе, то гуглите "linux memory rss virt" и читайте, разбирайтесь, проверяйте. Я буду подсчитывать использование rss памяти. Для этого предлагаю следующий скрипт, который можно запустить в bash консоли:
ps axo rss,comm,pid | awk '{ proc_list[$2] += $1; } END { for (proc in proc_list) { printf("%d\t%s\n", proc_list[proc],proc); }}' | sort -n | tail -n 10 | sort -rn | awk '{$1/=1024;printf "%.0fMB\t",$1}{print $2}'
Разбираем, что он делает:
1️⃣
ps axo rss,comm,pid - выводит список всех процессов, указывая pid, само название процесса и потребление памяти rss. Если у вас работает, к примеру, php-fpm, то у него может быть сотни процессов, так что сама по себе эта команда малоинформативна, так как генерирует огромный список. Начинаем его обрабатывать.
2️⃣
awk '{ proc_list[$2] += $1; } END - в данном случае $2 это второй столбец (название процесса) списка, полученного из первой команды, $1 (rss) - первый. Таким образом мы создаем словарь из названий процессов и в этом словаре сразу же суммируем rss всех процессов с одним и тем же именем. То есть записываем примерно следующее:
proc_list = ( [php-fpm]=51224, [mysql]=31441 ) и т.д.
3️⃣
{ for (proc in proc_list) { printf("%d\t%s\n", proc_list[proc],proc); }}' - заключительная часть обработки в awk, которая в цикле перебирает все названия процессов в словаре и выводит их по одному в каждой строке. В данном случае proc_list[proc] будет выводить rss процесса, proc - его название, конструкция "%d\t%s\n" определяет формат вывода: %d - десятичное число, \t - табуляция, %s - строка, \n - переход на новую строку.
4️⃣
| sort -n | tail -n 10 | sort -rn - это самая простая часть. Тут мы сначала сортируем предыдущий список по первому столбцу (rss) от меньшего к большему, потом оставляем только 10 последних значений (можете изменить, если вам надо больше), и делаем обратную сортировку, от большего к меньшему.
5️⃣
| awk '{$1/=1024;printf "%.0fMB\t",$1}{print $2}' - здесь мы просто причесываем вывод, деля rss на 1024, чтобы перевести в мегабайты и их же дописываем в конце. %.0f - округление до целого, \t - добавляет табуляцию. Можете это убрать, если вам не нужно.
Надеюсь после этого разбора магия bash вам покажется чуть более понятной. Такие однострочные конструкции трудно сходу воспринять и понять, если нет нормального опыта программирования на bash.
Я не сказать, что хорошо на нем программирую. Более того, даже этот скрипт я придумал не сам. Увидел когда-то и сохранил. Он достаточно известный и хорошо гуглится. Но вот разбора с описанием не найти. Восполняю пробел.
Сохрани на память. Частенько бывает нужен, если работаешь в консоли.