Как быстро выяснить какой процесс в Linux использует пространство подкачки (swap)

Заметка очень короткая и призвана администраторам помочь быстро найти процессы которые максимально используют пространство swap. Что делать с этими процессами — это уже отдельная тема, главное найти кто потребляет swap.

Подробности ниже…

Исходные данные: ОС Oracle Linux 7;
Задач: Найти потребителя 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 потребителей:

    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, что вполне нас должно устроить на первое время.

    На этом все, до скорых встреч. Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.


    Подписаться
    Уведомить о
    guest

    Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

    3 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии
    Sergios
    Sergios
    3 лет назад

    Спасибо за статью! Кстати в тексте опечатка «я показу»

    Сергей
    Сергей
    3 месяцев назад

    Благодарю за статью, в особенности за простой сценарий выявления потребителей SWAP.

    3
    0
    Оставьте комментарий! Напишите, что думаете по поводу статьи.x