Мониторинг нагрузки цп от пользователей ps, acct и atop

Попросил тут заказчик отмониторить пользователей на предмет нагрузки на сервер и собрать ему инфу. Почему то, когда встала задача мониторинга нагрузки cpu от пользователей в linux, у меня напрочь вылетело из головы про atop, который кстати у него на серваке установлен, и давно всё что надо уже собрал. И даже не посетила мысль поискать уже готовые решения. Нормальные герои всегда идут в обход. Я сразу начал думать «с низов», вот так:

ps -eo pid,ppid,user,cmd,%mem,%cpu --sort=-%cpu

Далее думалось написать скрипт, который будет это всё периодически собирать, группировать и подсчитывать сумму колонок в файле. И вот только на этом этапе разработка новой «супер» утилиты прервалась, потому что(нет, про atop я ещё не вспомнил!) вдруг подумалось: «а не спросить ли у гугла?». Ну гугл выдал acct, который я тут же поставил, включил и начал юзать с опцией -m, она же —user-summary

apt install acct
# ставим
/etc/init.d/acct status
# проверяем запущен ли
/atc/init.d/acct start
# стартуем
sa -m
# собираем суммарную по пользователям

Уже не плохо, подумал я, но скудность данных и качество документирования, вызывают матюги даже у англоязычных пользователей. Не говоря уж про мой фейс об тэйбл. И только тут в памяти всплыл atop…

acct полетел тут же в топку. Потому что во чё (перевод автоматический так что есть огрехи):

Usage: atop [-flags] [interval [samples]]
                or
Usage: atop -w  file  [-S] [-a] [interval [samples]]
       atop -r [file] [-b hh:mm] [-e hh:mm] [-flags]
общие флаги:
          -V показать информацию о версии
          -a показать или записать все процессы (т.е. только активные процессы)
          -R рассчитать пропорциональный размер набора (PSS) на процесс
          -P генерировать анализируемый вывод для указанных меток
          -L альтернативная длина строки (по умолчанию 80) в случае неэкранного вывода
          -f показать фиксированное количество строк с системной статистикой
          -F подавить сортировку системных ресурсов
          -G подавить возбужденные процессы в выводе
          -l показать ограниченное количество строк для определенных ресурсов
          -y показать отдельные темы
          -1 показывает среднее значение в секунду, т.е. итоговые значения

          -х нет цветов в случае высокой занятости
          -g показать общую информацию о процессе (по умолчанию)
          -m показать связанную с памятью информацию о процессе
          -d показать информацию о процессе, связанную с диском
          -n показать связанную с сетью информацию о процессе
          -s показать связанную с планированием информацию о процессе
          -v показать различную информацию о процессе (ppid, пользователь / группа, дата / время)
          -c показать командную строку для процесса
          -о показать собственную определенную информацию о процессе
          -u показать накопленную информацию о процессах для каждого пользователя
          -p показать накопленную информацию о процессе для каждой программы (то есть то же имя)
          -j показать накопленную информацию о процессе для контейнера

          -C сортирует процессы в порядке потребления процессора (по умолчанию)
          -М сортировка процессов в порядке потребления памяти
          -D сортирует процессы в порядке дисковой активности
          -N сортировать процессы в порядке сетевой активности
          -E сортировать процессы в порядке активности GPU
          -Сортировка процессов в порядке наиболее активного ресурса (автоматический режим)

        специальные флаги для необработанных лог-файлов:
          -w записать необработанные данные в файл (сжатый)
          -r читать необработанные данные из файла (сжатый)
              специальный файл: y [y ...] за вчерашний день (повторяется)
          -S заканчивать автоматически до полуночи (то есть. # Образцы)
          -b начать показ данных за указанное время
          -e закончить показ данных после указанного времени

        interval: количество секунд (минимум 0)
        samples: количество интервалов (минимум 1)

Если значение интервала равно нулю, новая выборка может быть
принудительно, отправив сигнал USR1 (kill -USR1 pid_atop)
или с помощью нажатия клавиши 't' в интерактивном режиме.

И я погнал шлепать ему отчёты:

atop -ur y >> atop.txt
atop -ur yy >> atop.txt
atop -ur yyy >> atop.txt
atop -ur yyyy >> atop.txt
atop -ur yyyyy >> atop.txt
atop -ur yyyyyy >> atop.txt
atop -ur yyyyyyy >> atop.txt

u — суммируем по юзерам, сортировка автоматом по использованию цп

r — говорим что будем читать лог, а каждая новая y соответствует предыдущему дню.

Круть ваще! Нашлепал почти 6 МБ текста, все с интервалом в 10 минут за 7 дней. Ток надо наоборот лучше, чтобы время шло по порядку в файле. И мне подумалось, что человеку будет затруднительно это всё прочитать ))) Вот тут и настало время обработки! Сначала отрубим то, что не интересует.

cat atop.txt | sed -n '/NPROCS/,/ATOP/p' | grep -v 'ATOP\|NPROCS' > atop2.txt

Ну отлично, уже 2.5 метра осталось и выглядит вполне прилично.

Назовем его потом — недельный отчёт по суммарной нагрузке цп юзерами с интервалами в 10 минут.

Выдернем всех юзеров:

cat atop2.txt | awk '{print $13}' | sort | uniq | grep -v 'RUID' | sed '/^$/d'

Не… нафик. Лучше так:

#!/usr/bin/env bash

if [ ! -d cpu_reports ]; then
    mkdir cpu_reports
fi

for file in 7days-10m 7days-4h 7days-5h; do
    if [ -f "cpu_reports/$file.txt" ]; then
        rm "cpu_reports/$file.txt"
    fi
done

if [ -f cpu_reports.zip ]; then
    rm cpu_reports.zip
fi

echo ' ________________________________________
/ Отчет по суммарной нагрузке цп от всех \
| юзеров за неделю с интервалами в 10    |
\ минут                                  /
 ----------------------------------------
    \
     \
                                   .::!!!!!!!:.
  .!!!!!:.                        .:!!!!!!!!!!!!
  ~~~~!!!!!!.                 .:!!!!!!!!!UWWW$$$
      :$$NWX!!:           .:!!!!!!XUWW$$$$$$$$$P
      $$$$$##WX!:      .<!!!!UW$$$$"  $$$$$$$$#
      $$$$$  $$$UX   :!!UW$$$$$$$$$   4$$$$$*
      ^$$$B  $$$$\     $$$$$$$$$$$$   d$$R"
        "*$bd$$$$       *$$$$$$$$$$$o+#"
             """"          """""""
' > cpu_reports/7days-10m.txt

for item in yyyyyyy yyyyyy yyyyy yyyy yyy yy y; do
    atop -ur $item | sed -r '/^[a-zA-Z]{3} \|/d' >> cpu_reports/7days-10m.txt
done


echo ' ________________________________________
/ Отчет по суммарной нагрузке цп от всех \
| юзеров за неделю с интервалами в 4     |
| часа. Время замеров 03:00 07:00 11:00  |
\ 15:00 19:00 23:00                      /
 ----------------------------------------
    \
     \
                                   .::!!!!!!!:.
  .!!!!!:.                        .:!!!!!!!!!!!!
  ~~~~!!!!!!.                 .:!!!!!!!!!UWWW$$$
      :$$NWX!!:           .:!!!!!!XUWW$$$$$$$$$P
      $$$$$##WX!:      .<!!!!UW$$$$"  $$$$$$$$#
      $$$$$  $$$UX   :!!UW$$$$$$$$$   4$$$$$*
      ^$$$B  $$$$\     $$$$$$$$$$$$   d$$R"
        "*$bd$$$$       *$$$$$$$$$$$o+#"
             """"          """""""
' > cpu_reports/7days-4h.txt

for item in yyyyyyy yyyyyy yyyyy yyyy yyy yy y; do
    for i in 03 07 11 15 19 23; do
        atop -ur $item -b $i:00 -e $i:09 | sed -r '/^[a-zA-Z]{3} \|/d' >> cpu_reports/7days-4h.txt
    done
done

echo ' ________________________________________
/ Отчет по суммарной нагрузке цп от всех \
| юзеров за неделю с интервалами в 5     |
| часов. Время замеров 03:00 08:00 13:00 |
\ 18:00 23:00                            /
 ----------------------------------------
    \
     \
                                   .::!!!!!!!:.
  .!!!!!:.                        .:!!!!!!!!!!!!
  ~~~~!!!!!!.                 .:!!!!!!!!!UWWW$$$
      :$$NWX!!:           .:!!!!!!XUWW$$$$$$$$$P
      $$$$$##WX!:      .<!!!!UW$$$$"  $$$$$$$$#
      $$$$$  $$$UX   :!!UW$$$$$$$$$   4$$$$$*
      ^$$$B  $$$$\     $$$$$$$$$$$$   d$$R"
        "*$bd$$$$       *$$$$$$$$$$$o+#"
             """"          """""""
' > cpu_reports/7days-5h.txt

for item in yyyyyyy yyyyyy yyyyy yyyy yyy yy y; do
    for i in 03 08 13 18 23; do
        atop -ur $item -b $i:00 -e $i:09 | sed -r '/^[a-zA-Z]{3} \|/d' >> cpu_reports/7days-5h.txt
    done
done

zip cpu_reports.zip cpu_reports/* > /dev/null
rm -r ./cpu_reports
echo 'done!'

Запустил, скачал архив и досвидос.

 

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *