Попросил тут заказчик отмониторить пользователей на предмет нагрузки на сервер и собрать ему инфу. Почему то, когда встала задача мониторинга нагрузки 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!'
Запустил, скачал архив и досвидос.