zabbix监控脚本02-进程使用的cpu率计算
1 基础说明
(1)配合的监控工具 zabbix,被监控端操作系统版本信息
操作系统:CentOS Linux release 7.4.1708 (Core)
内核版本:3.10.0-693.el7.x86_64
(2)说明:此处的脚本直接使用的是linux下进程文件的数据做计算
(3)文件内容说明(转到第三点):/proc/stat,/proc/pid/stat
说明:此处数字指明了CPU执行不同的任务所消耗的时间(从系统启动开始累计到当前时刻); 时间单位是USER_HZ或jiffies(通常是百分之一秒)
(4)脚本计算的是java进程每秒使用的cpu量占总cpu的多少,脚本名称可以命名为 java_cpu.sh
1 #!/bin/bash 2 3 R_MON="$1" 4 5 vmrss_cpu_used() { 6 R_PID=$(ps -fe | grep "${R_MON}" | grep -v "grep" | grep "jar" | awk -F" " '{print $2}') 7 #总cpu量计算 8 CPU_ALL1=$(head -1 /proc/stat | awk -F" " '{sum=0; sum=$2+$3+$4+$5+$6+$7+$8+$9+$10+$11; print sum}') 9 #单个进程使用的cpu量计算 10 CPU_ONLY1=$(awk -F" " '{sum=0; sum=$14+$15+$16+$17; print sum}' /proc/${R_PID}/stat) 11 sleep 1 12 CPU_ALL2=$(head -1 /proc/stat | awk -F" " '{sum=0; sum=$2+$3+$4+$5+$6+$7+$8+$9+$10+$11; print sum}') 13 CPU_ONLY2=$(awk -F" " '{sum=0; sum=$14+$15+$16+$17; print sum}' /proc/${R_PID}/stat) 14 15 CPU_ONLY_VALUE=$(( ${CPU_ONLY2} - ${CPU_ONLY1} )) 16 CPU_ALL_VALUE=$(( ${CPU_ALL2} - ${CPU_ALL1} )) 17 18 #比率计算 % 19 VALUE=$(awk -v v1=${CPU_ONLY_VALUE} -v v2=${CPU_ALL_VALUE} -v v3=100 'BEGIN{printf "%.4f\n",(v1/v2)*v3}') 20 echo ${VALUE} 21 echo "$(date +%Y-%m-%d-%H-%M-%S) :: ${VALUE}" >> /usr/local/zabbix/scrip_log/java_cpu_used_${R_MON}.txt 2>&1 22 } 23 24 case $R_MON in 25 程序名称1) 26 vmrss_cpu_used "$R_MON" 27 ;; 28 程序名称2) 29 vmrss_cpu_used "$R_MON" 30 ;; 31 *) 32 echo $"USAGE:$0 {VmRSS|}" 33 esac
2 脚本使用
(1)添加在zabbix里面
echo 'UserParameter=java_cpu_totals[*],/bin/bash /usr/local/zabbix/scrip/java_cpu.sh "$1"' >> /usr/local/zabbix/etc/zabbix_agentd.conf.d/userparameter_java.conf
3 /proc/stat 和 /proc/pid/stat 文件内容说明
(1) /proc/stat 文件内容说明
注:此处的cpu为8核cpi,1行是CPU各项指标的总数,2-9是每个核上CPU各项指标的总数
cpu 13430092 1323 7929863 870119298 287657 0 1076079 0 0 0 cpu0 3263709 124 1412175 106262718 50419 0 555353 0 0 0 cpu1 1670908 60 917118 109151971 11243 0 71627 0 0 0 cpu2 1509810 97 890354 109511188 7364 0 62954 0 0 0 cpu3 1278826 66 650084 109918312 5620 0 67318 0 0 0 cpu4 1706116 38 1999796 108248897 5712 0 65622 0 0 0 cpu5 1205283 70 717599 109153268 7065 0 71790 0 0 0 cpu6 1378864 451 671022 108832446 182545 0 89862 0 0 0 cpu7 1416573 414 671712 109040494 17684 0 91550 0 0 0 intr 4647558087 138 10 0 0 0 0 2 0 1 0 0 0 16 0 0 1101875 14797234 9521023 308408444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ctxt 4436228084 btime 1687850140 processes 7710519 procs_running 3 procs_blocked 0 softirq 2066761244 0 738102220 374147 716745377 9723972 0 1413206 193184643 0 407217679
<1>对上述的输出内容解释如下
CPU指标:user、nice、system、idle、iowait、irq、softirq
user:到目前为止,CPU上nice值不大于0的用户态任务的运行时间
nice:到目前为止,CPU上nice值大于0的用户态任务的运行时间
system:到目前为止,CPU上内核态的运行时间。包括用户态任务系统调用、异常等陷入内核消耗时间,也包括内核线程消耗的时间; 但是不包括中断和软中断的执行时间
idle:到目前为止,处于idle任务的时间。不包括CPU上因为任务IO阻塞导致CPU上没有任务可运行、处于idle状态的时间
iowait: 到目前为止,由于CPU上任务IO阻塞导致CPU无可运行任务、处于idle的时间。需要强调的是,iowait是在CPU处于idle状态下的一种特殊情况的时间,与上面的"idle"列互补构成CPU上真正处于idle的时间
irq:到目前为止,CPU进入到中断处理的时间(在没有使能CONFIG_IRQ_TIME_ACCOUNTING的情况下,大部分架构实际上无法记录到该项,见下面的分析)
softirq:到目前为止,CPU处理软中断的时间,包括softirqd中处理软中断的时间
intr:各个中断在所有CPU上发生的次数总和
ctxt: 对各个CPU进行遍历,将各个CPU上cpu_rq(cpu)->nr_switches字段进行累加,即每个CPU上任务切换的次数总和
btime:从Epoch(即1970零时)开始到系统启动所经过的时长,在内核中由boottime.tv_sec这个变量表示,单位秒
processes:系统启动以来成功fork()的次数,由total_forks变量记录
procs_running:系统中各个CPU上处于就绪/运行状态任务的数量总和,每个CPU上处于就绪/运行状态任务个数由cpu_rq(cpu)->nr_running表示
procs_blocked:系统中各个CPU上处于iowait状态任务的数量总和,每个CPU上处于iowait状态的任务数量由cpu_rq(cpu)->nr_iowait记录
softirq:与intr字段类似,各个软中断发生的总次数
(2) /proc/pid/stat 文件内容说明