BASH: скрипт статистики использования ресурсов процессом

Автор: | 09/26/2014
 

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