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