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