как понять кто занимает swap в linux
Заметка очень короткая и призвана администраторам помочь быстро найти процессы которые максимально используют пространство swap.
Проблема: Найти потребителя SWAP
Типичная ситуация на сервере с системой мониторинга — это аларм вида:
prod-srv-01 Low free swap space (free: 0.15 %, threshold: 10%, alert started: 8.79 %)
Вначале немного теории, о том как получить информацию о распределении памяти процессами в Linux.
- /proc/meminfo — псевдо-файл который сообщает статистику об использовании памяти в системе. Вы также можете использовать утилиты free, vmstat и другие инструменты, чтобы узнать ту же информацию;
- /proc/${PID}/smaps, /proc/${PID}/status и /proc/${PID}/stat — используйте эти псевдо-файлы для поиска информации о потреблении памяти каждым процессом (${PID} замените на номер процесса);
- smem — утилита (скрипт python), которая поможет вывести информацию в более удобном виде;
Теперь идем на сервер и смотрим:
[root@prod-srv-01 ~] # free -h |
total used free shared buff/cache available |
Mem: 15G 2.9G 168M 5.6G 12G 6.8G |
Swap: 5.0G 5.0G 0B |
[root@prod-srv-01 ~] # vmstat |
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- |
r b swpd free buff cache si so bi bo in cs us sy id wa st |
3 0 5242876 177632 5664 12976844 0 0 1102 189 0 0 21 2 70 7 0 |
Мы видим, что swap заполнен на 100% — это плохо.
Попробуем быстро выяснить кто основной потребитель, для этого обратимся к /proc/*/status
Ниже простой сценарий на bash который выдаст нам список потребителей swap:
for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $ file ; done | sort -k 2 -n -r | less |
Результат будет длинным, я покажу только TOP потребителей:
Мы видим, что основной потребитель — это процесс ora_j001_bs. На сервере установлен Oracle и один из процессов потребляет swap.
На втором месте мы видим процесс rsyslogd — думаю он в представлении не нуждается.
Если на потребителя №1 мы не можем повлиять быстро, то на потребителя №2 (rsyslogd) можем — это попытаться его перазапустить.
Выполняем перезапуск rsyslogd:
systemctl restart rsyslog |
И смотрим состояние swap:
[root@prod-srv-01 ~] # free -h |
total used free shared buff/cache available |
Mem: 15G 2.8G 301M 5.6G 12G 6.9G |
Swap: 5.0G 3.4G 1.6G |
Мы видим, что стало доступно 1.6 GB, а это уже более 30% от размера swap, что вполне нас должно устроить на первое время.
источник: https://blog.programs74.ru/linux-which-process-is-using-swap/