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 文件内容说明

 

posted @ 2023-05-30 14:52  shadown404  阅读(373)  评论(0编辑  收藏  举报