как понять кто занимает 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 ""}' $filedone sort -k 2 -n -r | less

Результат будет длинным, я покажу только TOP потребителей:

top swap usage

top swap usage

 

Мы видим, что основной потребитель — это процесс 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/