Задача – снимать потребление памяти и нагрузку процессора, которые генерируется сервером MySQL (MariaDB).
Скрипт тестировался на:
# cat /etc/redhat-release CentOS release 6.5 (Final)
И bash
:
# bash --version GNU bash, version 4.1.2(1)-release (i386-redhat-linux-gnu)
Само собой, что измерять можно что угодно – просто заменить значения переменных $PNAME
и $TNAME
.
Сам скрипт:
#!/usr/bin/env bash # имя процесса, который мониторим (используется в grep) PNAME="/usr/sbin/mysql" # а для top-а пришлось отдельно имя давать TNAME="mysqld" # получаем PID процесса MySQL getpid () { MPID=`ps axo pid,command | grep $1 | grep -v grep | cut -d' ' -f 1` } processes_number () { # считаем количество процессов MySQL CPID=`ps axo pid,command | grep $1 | grep -v grep | cut -d' ' -f 2 | wc -l` } process_info () { # % времени затраченный CPU на обработку процесса (все потоки + сам процесс / на количество процессоров) PICPU=`top -p $MPID -b -n 1 | grep -w $1 | awk '{print $9}'` # % от MemTotal (/proc/meminfo) # можно обойтись без ps, просто брать данные из /proc/meminfo и # считать /proc/$MPID/status VmRSS от неё PIMEM=`ps axo %mem,command | grep -v grep | grep /usr/sbin/mysqld | awk '{print $1}'` # реально используемая память (resident memory) PIRSS=`cat /proc/$MPID/status | grep VmRSS | awk '{print $2}'` } process_threads () { # количество потоков MySQL PT=`ps -eLf | grep "/usr/sbin/mysqld" | grep -v grep | wc -l` } load_average () { # текущее значение Load Average LA=`uptime | cut -d' ' -f 12 | sed 's/,//'` } # PID нам нужен один раз, поэтому запускаем функцию не в цикле getpid $PNAME # просто стартуем скрипт, и выходим по Ctrl+C while true; do processes_number $PNAME process_info $TNAME process_threads load_average printf "PID: %s, Process numbers: %s, process threads: %s, CPU: %s%%, MEM: %s%%, RSS: %s KB, Current LA: %sn" $MPID $CPID $PT $PICPU $PIMEM $PIRSS $LA # без sleep больше информации, но может быть неудобно # sleep 1 done
И результат работы:
# ./mysqltest.sh PID: 1268, Process numbers: 1, process threads: 42, CPU: 0.0%, MEM: 10.3%, RSS: 106940 KB, Current LA: 1.31 PID: 1268, Process numbers: 1, process threads: 41, CPU: 2.0%, MEM: 10.3%, RSS: 106900 KB, Current LA: 1.31 PID: 1268, Process numbers: 1, process threads: 41, CPU: 5.7%, MEM: 10.3%, RSS: 106900 KB, Current LA: 1.92 PID: 1268, Process numbers: 1, process threads: 41, CPU: 0.0%, MEM: 10.3%, RSS: 106900 KB, Current LA: 1.92
Пример нагрузочного тестирования:
# ./mysqltest.sh PID: 1301, Process numbers: 1, process threads: 41, CPU: 0.0%, MEM: 7.4%, RSS: 76752 KB, Current LA: 0.54 PID: 1301, Process numbers: 1, process threads: 41, CPU: 0.0%, MEM: 7.4%, RSS: 76752 KB, Current LA: 0.54 PID: 1301, Process numbers: 1, process threads: 142, CPU: 13.9%, MEM: 8.7%, RSS: 94684 KB, Current LA: 7.70 PID: 1301, Process numbers: 1, process threads: 142, CPU: 47.2%, MEM: 9.3%, RSS: 97136 KB, Current LA: 11.41 PID: 1301, Process numbers: 1, process threads: 135, CPU: 63.7%, MEM: 9.5%, RSS: 98112 KB, Current LA: 22.02 PID: 1301, Process numbers: 1, process threads: 43, CPU: 44.4%, MEM: 9.5%, RSS: 93512 KB, Current LA: 24.50 PID: 1301, Process numbers: 1, process threads: 41, CPU: 2.0%, MEM: 7.8%, RSS: 80868 KB, Current LA: 24.50
Хорошо бы потратить время, и сделать мини-мониторилку, на Python, в веб-интерфейсом и графиками.