易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 435|回复: 6
收起左侧

cpu使用率计算解说脚本统计计算

[复制链接]
发表于 2023-9-16 22:28:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
在Linux系统中可以通过/proc/stat文件来计算CPU的使用率。其中各项参数说明:# Z$ g3 i# z# @4 m

" D8 L) K- \1 O: ?6 H( Y0 o4 {* }cat /proc/stat . c6 r% s% u' S% q. q4 d) P
cpu  8742195 15 754479 55626730 192455 0 32760 0 0 0
- H, \% i' y* w: o) a# V8 ]) h* K! k+ y5 ecpu0 326672 0 97560 7716403 21364 0 7494 0 0 0
6 z3 x- B- ^8 J* {: Z3 d! D& Jcpu1 230096 2 109184 7784794 24447 0 5431 0 0 0' P% D/ p' D% o4 I+ k2 Z
cpu2 2498253 0 80762 5566047 26575 0 3556 0 0 0# `$ k( v; d& G+ F* q
cpu3 2733988 0 76288 5345517 18368 0 2986 0 0 0; l1 t. D! t! u9 H) u" P
cpu4 1268765 2 93512 6772088 32527 0 3460 0 0 0
6 }( ]4 s! T( z% Dcpu5 577480 0 100944 7466708 19525 0 3660 0 0 0
% h+ b3 Y- G* K3 v+ Z* A' Lcpu6 575574 0 99252 7464805 24467 0 2785 0 0 0
& ]- n& x, c6 k! N! \0 o9 U: Zcpu7 531364 9 96973 7510365 25178 0 3384 0 0 0
+ Y4 c, j5 u: _3 Dintr 347966894 72 10 0 0 0 0 0 0 1 0 0 0 1066 0 0 80304 385602 739524 66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11922 0 1240809 945007 1230083 1116211 1010085 923266 908909 811577 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) Z7 A9 l8 G0 Z+ ^7 ^
ctxt 374979507
5 G1 v8 ]' c! H6 I+ nbtime 1694791989; R% s# H* v) v9 b1 e- p
processes 2234872
; {& ~) z* Z0 V$ A# gprocs_running 4$ T. k' k& [& B) {* p! ^6 ^( z
procs_blocked 0
6 |# e( ?/ |2 s, {, |3 `softirq 279664532 1 159117851 16412 20782044 785020 0 41986 18593620 0 80327598/ u' J0 X' N+ |/ N
5 n+ s" |3 |6 W! f' c

6 S- ]5 S4 E& G7 K
. r3 i) x3 ]8 H6 y8 J! `3 W1 ]
# O$ ^. z4 w! s就拿第一行来说:
, Y: }( }# R" ~1 z
' E1 U8 }- z% [8 h$ J0 `) s, \$ p0 ]   cpu  8742195 15 754479 55626730 192455 0 32760 0 0 0
/ N' f1 B; u& {" [0 o& p1 A7 E/ N4 j- O& z
8 I& q7 e% j3 `' E
第一个字段(cpu)是cpu标识。
& q4 b/ U" U  G5 L( S0 l, t& T
# h, G" q# ~8 Q: m第二个字段(8742195)表示是从系统启动开始一直到当前时刻,进程在用户态(user)下执行的时间积累。2 g5 U1 v: H1 A6 O. G# c5 j
# J0 c/ Q4 D1 K, d( Y* H
第三个字段(15)表示是从系统启动开始一直到当前时刻,nice值为负的进程所占用的CPU时间。& h9 S! M* h$ n7 }: g6 S+ h
7 E' Q" l5 ?' Y! w  K
第四个字段(754479)表示是从系统启动开始一直到当前时刻,进程在系统内核(system)的执行时间积累。  m0 g6 z2 }. K
- V3 s* [0 d; w7 A$ v
第五个字段(55626730)表示是从系统启动开始一直到当前时刻,处硬盘IO等待以外其他的空闲时间(idle)积累。, y4 }- H7 o& z+ k

1 W# l9 Y6 t1 F+ S3 i3 S& b% x第六个字段(192455)表示是从系统启动开始一直到当前时刻,IO等待(iowait)的时间积累。9 s. S* c0 K, Y% x# h0 [3 g
) l! q. t, @+ Z2 `. ?1 m2 ^; p
第七个字段(0)表示是从系统启动开始一直到当前时刻,硬中断的时间(irq)。6 |+ x# V( g. l# T" ]5 D( r

  a0 G# p6 a* r+ P+ w/ [# L第八个字段(32760)表示是从系统启动开始一直到当前时刻,软中断的时间(softirq)。
2 \3 `" i3 q7 l8 ~2 j" v, X2 ^5 |* B8 T; C6 @4 W! c! i
剩下的几行:% [/ v- P* o2 S! C$ F& a
7 J8 F. ?% ^4 ?/ W
intr: 给出的是中断信息,第一个数为自系统启动以来,发生的所有中断的次数;后面的每个数对应一个特定的中断,表示该中断自系统启动以来发生的次数。
# s- j* M+ m0 T6 D- f$ L$ z% n9 h/ R* L8 G
ctxt: 表示系统CPU发生的上下文交换次数。
& n1 S, i% j. H; c
! A* f% d/ w0 G4 ]- ibtime: 表示自系统启动到现在的时间,单位为秒。9 d" c; O% {6 A" h( c

' e0 h5 u9 l6 x6 y: U" M" T! a# dprocesses: 表示自系统启动以来所创建的任务的数目。
$ `; ~6 f$ X* U- T' n
5 K# p& c/ R, h; R% Nprocs_running: 当前运行队列的任务数目。* W& f8 A! G! {# P  g

3 R4 m: B5 f6 r2 k  Sprocs_blocked: 当前被阻塞的任务数目,等待I/O完成次数。) s! h# g6 a4 ^. @

' S1 A1 f8 L3 Z4 h( NCPU的使用率可以通过如下方式计算:
% X7 @4 s4 j6 l, I* \! z0 l, S7 s/ \, j
cpu_usage=(idle2-idle1)/(cpu2-cpu1)*100
; \' J- @# i+ c% {( Q: J, g3 t  I! m  Y
cpu_usage=[(user2+sys2+nice2)-(user1+sys1+nice1)]/(total2-total)*100
' x/ i# q  d! T# g' o9 {5 B1 p/ v9 u
获取CPU使用率的相关脚本如下:
1 }/ p6 X6 {7 }7 W0 a
5 L' K" r) F; o
1 D3 T+ Y$ n. l9 o; n3 ~# k登录后复制
* K$ T3 o- L6 S$ u#!/bin/sh8 w0 W" i. R! W6 L: B& k* `3 k# E
#) ^+ \4 j/ J3 U" g/ f7 \  |
#脚本功能描述:依据/proc/stat文件获取并计算CPU使用率' k0 R: O0 ]  y) o$ k8 p) H% D
#  z! e- U1 f, O
#CPU时间计算公式:CPU_TIME=user+system+nice+idle+iowait+irq+softirq2 B$ N: Y* l8 t  W
#CPU使用率计算公式:cpu_usage=(idle2-idle1)/(cpu2-cpu1)*100
9 v* ~1 o0 ]' z1 Y  Z#默认时间间隔
3 _' D5 k  S: f+ }1 s2 ?TIME_INTERVAL=5" d7 d; x0 k! U: f( q

! U7 k8 X/ o- f+ l* QLAST_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')
" P3 O* E8 s- ]% @1 NLAST_SYS_IDLE=$(echo $LAST_CPU_INFO | awk '{print $4}'); P- i& [; ~/ G1 Z$ l3 [
LAST_TOTAL_CPU_T=$(echo $LAST_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')# H+ P5 ^+ w7 m- o3 G5 V) Y
sleep ${TIME_INTERVAL}4 l4 X+ R9 U4 o9 j3 V$ P. H
NEXT_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')7 O8 k2 p1 _2 o4 h7 \* d# R+ z* J
NEXT_SYS_IDLE=$(echo $NEXT_CPU_INFO | awk '{print $4}')6 R$ @" L5 Z7 e4 O' |( m3 [+ M7 ^
NEXT_TOTAL_CPU_T=$(echo $NEXT_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')( ]" x2 e$ C1 d, G6 I  [
/ y, m! d0 |2 c  U+ o
#系统空闲时间
, `* V5 X& |1 m# iSYSTEM_IDLE=`echo ${NEXT_SYS_IDLE} ${LAST_SYS_IDLE} | awk '{print $1-$2}'`* I) s/ o0 A: X* M
#CPU总时间9 H5 T6 B$ U- b6 k
TOTAL_TIME=`echo ${NEXT_TOTAL_CPU_T} ${LAST_TOTAL_CPU_T} | awk '{print $1-$2}'`+ {' M6 G/ d4 W! ^+ o# u9 m; i
CPU_USAGE=`echo ${SYSTEM_IDLE} ${TOTAL_TIME} | awk '{printf "%.2f", 100-$1/$2*100}'`+ {9 e7 ]+ Q0 ~' t3 B# D

: P( w. P( ?0 P6 Kecho "CPU Usage:${CPU_USAGE}%"
/ H* b! k- W0 H6 ^4 ?
* H2 \* |7 p6 w# r" V' H  L$ A. T. y* O% C2 W4 p
+ c4 K. J* X' {+ t$ _. j" c0 C: Y( R

: g' S  _* b4 d9 A6 a/ ?[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}', u" j' C3 Q# Q) N, ^' {
14.9, c  K3 U8 J1 r% g( Y% U- w2 z
[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)'
! K; i5 o5 F8 U- f%Cpu(s): 20.3 us,  4.1 sy,  0.0 ni, 75.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
0 U' U. h6 Y& k1 }' f% [[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'
+ n0 N$ f# Y5 ~* r& A0 v( G27.0! c* e0 I2 O1 I" W( ]+ M" p2 i
2 ^& P; I! }8 g/ k7 D! x. m
for循环脚本:& [7 }4 d5 m3 e
for((i=1;i<=5;));  * o. o) B0 _3 d4 C7 O
do   ; {8 F/ k2 O0 x7 ]2 h5 G, a
    cpu_us=`top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'`
3 o& a+ Z3 g7 d! `    cpu_sy=`top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $5}'`" F: v1 C6 r& ~2 ]. J) y$ D
    #echo $cpu_us
: _, x0 Y0 f/ L. R6 @! n1 x    #echo $cpu_sy
0 p8 T& w4 \7 S( S! Z( D    cpu_sum=$(echo "$cpu_us+$cpu_sy"|bc)6 l8 U1 c+ {7 M$ `' w5 ?
    nowdate=$(date +"%Y-%m-%d %H:%M:%S")0 i" a$ W4 w, Z0 p4 Y
    echo "$nowdate CPU_SUM: $cpu_sum%" >> ./cpu.log
. t$ Y# z# v2 z8 i+ j4 J5 f! E    sleep 120
( }: A3 r1 C3 W' e' W( ?& gdone
* O2 \0 j! ?6 Q* W. S% j- w
, T( Q, p9 l1 d! [& u% w- T, j+ ?6 Z' O' e: u$ z) N* _8 }7 q! R

, X1 k  D5 A8 E0 ~0 r+ }nohup sh cpu.sh >/dev/null  2>&1 &
2 v) J  ^; m, u  F# h5 t5 Q" x4 S( J+ D7 b  C! P
" P- q* s7 V# ]3 v

" `: L" b; _# D  M

/ V" V) w0 J$ W. D% \; i" \+ y; j/ g4 H' a- v( P0 n* r" C
7 U* N* D! R& L" Y* M1 S

; D2 }5 y0 T6 O7 g
 楼主| 发表于 2023-9-16 22:32:06 | 显示全部楼层
#!/bin/bash1 ~# _; X  B4 a" V& V

- h( [/ J9 W7 w, q6 k5 h& Q3 C# 获取ip
5 u* a/ x5 r$ }* i+ R7 Tip=`ip addr show eth0 | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print ""$2 }'`
4 v9 O' g$ [& v0 K. B& f" P! jecho $ip
! g& s; K/ e6 W: o- \ip_index=`echo $ip | awk -F '.' '{print $4}'`( h4 B6 {6 y8 v+ j, B

1 U% h: o( x, [, O9 M#计算cpu使用率7 G5 Q( u) u7 F& t$ O
cpu=`top -b -n1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{split($1, vs, ","); v=vs[length(vs)]; sub(/\s+/, "", v);sub(/\s+/, "", v); printf "%d", 100-v;}'`
# e9 [2 p) T  Pecho $cpu; H1 z( H8 {3 ?% i! S; ?
- x0 ]% W) V7 N
#统计内存使用率$ M* L1 S5 L2 V  d
mem_used_persent=`free -m | awk -F '[ :]+' 'NR==2{printf "%d", ($2-$7)/$2*100}'`8 E4 U3 h$ n- j9 V2 x0 W$ A8 h# |
echo $mem_used_persent
 楼主| 发表于 2023-9-16 22:33:40 | 显示全部楼层
top 参数、含义、思路) D- t/ `' d, V# y. W8 C$ a( D. N
查了一下top的参数, -n 参数的意思是 刷新一次就停止(只输入top 是会一直在刷新的)
; X; y9 R; y( HCpu 这一行有很多个参数,每个参数都有自己的含义:
* |) s# Y; y  Cus 是用户空间占比
( |; f- f0 j% y' lsy 是内核态占比
% O& e; i" K2 b% f% O6 u" Oid 是空闲占比  k1 @0 R& m+ @7 \' v0 q. Z! c
还有其它的都是各种场景的使用占比: J) o1 ^2 ~: C, S& G. m
所以我们是取出 id, 然后 100-id, q2 s: _6 E4 ?3 I0 y4 w

+ e- W3 ^  }; i- {
 楼主| 发表于 2023-9-16 22:36:19 | 显示全部楼层
2个CPU表明系统负荷可以达到2.0,此时每个CPU都达到100%的工作量。推广开来,n个CPU的电脑,可接受的系统负荷最大为n.0。2 k3 p* J" ^2 v" R
2、查看服务器cpu的总核数
# W2 g( B$ Y/ ]' T复制代码代码如下:
$ Y2 q/ X. F' P( x- H8 z/ B( B4 w' @9 s
# grep -c 'model name' /proc/cpuinfo  或者       cat /proc/cpuinfo
5 P) D1 x) |6 K" {' [; L, J: R  p$ f: \$ y9 c% V' C
3、截取服务器1分钟、5分钟、15分钟的负载情况( |8 J$ T1 X2 E- x
复制代码代码如下:3 {% L4 |" d5 @4 V, L5 t. e6 y5 P

' v, l5 a% z" j# uptime | awk '{print $8,$9,$10,$11,$12}') C7 |' I5 B+ Z7 B
   load average:  0.01,    0.02,   0.003 ^/ t/ V% Z% n+ m- \
4、查看截取15分钟的平均负载: s! v7 _. D  K6 G: z* [
) ^9 V' V3 C$ a. g* C$ h
复制代码代码如下:
8 b3 [6 N, I8 {3 y- a. z( [9 d
* Z. g/ K2 |$ {# uptime | awk '{print $12}' (用 '{print $12}' 这个获取的不够准确,如果都用awk取第12个字段的话,结果有可能为空了。而用$NF表输出最后一段的内容)
6 C! V3 t9 f! T6 m# c, l# uptime | awk '{print $NF}'
1 Q4 n9 {, h- R) @9 m# A$ I9 B/ ?* A6 b4 ^" B( R
5、编写系统负载监控的脚本文件:
2 ^2 t: j0 A; d; ~% f7 u复制代码代码如下:9 a2 E9 ]8 |! _2 A, C+ B

7 b# A3 x3 m8 D$ O1 }# vim /scripts/load-check.sh
  l4 t$ ], a  k$ c3 \# o[code]( M2 h: w- Y, D5 x; R& D! L
#!/bin/bash & p1 F' J, V% M- v" e7 B% ~
#使用uptime命令监控linux系统负载变化
" T( @  ]4 a" g6 ]# ]8 N
! @' D+ N/ B$ s, I#取系统当前时间(以追加的方式写入文件>>) 3 h' T) Q7 q% I7 x- ^3 G
date >> /scripts/datetime-load.txt   
: @' c6 H" ], P% C 3 j2 S+ x, H% [# b5 n% _+ l* h0 R8 E
#提取服务器1分钟、5分钟、15分钟的负载情况
# F, ^, j1 T4 x# quptime | awk '{print $8,$9,$10,$11,$12}' >> /scripts/load.txt 8 a8 t2 J& L, \

7 Z" E  j- w! P* }#逐行连接上面的时间和负载相关行数据(每次重新写入文件>) 8 ^+ f7 t/ S8 i! H9 t& m2 S1 j/ e1 l
paste  /scripts/datetime-load.txt /scripts/load.txt   > /scripts/load_day.txt, [& h4 t2 m6 J0 \! W6 x! `
# chmod a+x /scripts/load-check.sh) g" {4 v2 I' c" {7 R
6、编写系统负载结果文件邮件发送脚本:
# C; H) t9 j" I) R/ h复制代码代码如下:# U; B) Y. Y8 |4 I
7 h& }! J3 ^: W
# vim /scripts/sendmail-load.sh7 ~  n' Z0 A  S+ K) c
#!/bin/bash
2 T/ D8 q1 u; r! Q% E+ x#把系统负载监控生成的load_day.txt文件通过邮件发送给用户 4 d$ l( f' P# D% A
8 S+ B  X$ Q5 k! ]6 z7 ^( Y! L# l
#提取本服务器的IP地址信息
. C8 B  x9 D% a5 l- nIP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` , X+ @8 N8 V- {
( d) J& H0 I8 A& P
#提取当前日期 + z3 B6 N1 V( g
today=`date -d "0 day" +%Y年%m月%d日`
6 X4 {9 G' |3 y& T3 |$ T ; t" y; X7 u" `, m" S2 w
#发送系统负载监控结果邮件 0 }" P' S+ |! U* B3 ~
echo "这是$IP服务器$today的系统负载监控报告,请下载附件。" | mutt -s "$IP服务器$today的系统负载监控报告" -a /scripts/load_day.txt  fuquanjun@xxx.com
; z5 ^4 y8 H; U5 }# l- f# chmod a+x /scripts/sendmail-load.sh
3 V: R1 `4 l2 n8 t1 b' K# v7 x7、编写系统负载监控的脚本文件:
- b" o4 e( O# O$ {/ ]9 c复制代码代码如下:" ~) n9 f, f, P

9 T) v- D+ m+ \5 U5 W# vim /scripts/load-warning.sh
/ O+ {$ ?( k: _) l8 R#!/bin/bash
& R/ W6 o& i( v! A1 @; }' M3 d#使用uptime命令监控linux系统负载变化
: I; Q! }5 ?7 Y5 D
9 i; B+ H  ^1 D8 Q#提取本服务器的IP地址信息
" K% L. _* d- X6 X" G$ f  k' B( rIP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` - u- {/ l7 _1 F2 {" ~3 Y
3 L7 x; @  |0 j3 b6 S
#抓取cpu的总核数
5 k) a9 x/ ^6 Tcpu_num=`grep -c 'model name' /proc/cpuinfo`
8 G% V: V2 F  |8 D" [% L
3 h) ]7 ?2 c4 i9 I- z#抓取当前系统15分钟的平均负载值 8 j- `& ]* S. K, T, i
load_15=`uptime | awk '{print $NF}'`
: u$ j5 L: X2 |- J
3 g7 [; J/ W$ G$ n#计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。
; V/ @* D9 q8 k" o: z/ Q1 v" `; iaverage_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc`
. m# J/ Z6 f% {( r
) k! X" u6 n. L, h* z& X#取上面平均负载值的个位整数 ( ~: B( P  _4 z, T- Z2 T
average_int=`echo $average_load | cut -f 1 -d "."`
2 p; g9 [# U/ y( g& D! V- ^3 H
4 ^9 N) }4 ?; o; F#设置系统单个核心15分钟的平均负载的告警值为0.70(即使用超过70%的时候告警)。
- J4 r$ _: L8 Eload_warn=0.70 9 D) E/ z( f9 a6 E

+ S. Q; V8 X2 |; R% A$ }4 F$ f#当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0) ,直接发邮件告警;如果小于1.0则进行二次比较 # |  ?' v$ }8 U' s: r
if (($average_int > 0)); then
' _' b1 `; S* @) Q! F- m( B) k      echo "$IP服务器15分钟的系统平均负载为$average_load,超过警戒值1.0,请立即处理!!!" | mutt -s "$IP 服务器系统负载严重告警!!!"  fuquanjun@xxx.com
6 G) ?2 u8 `6 selse
  \, G- g/ ^) \7 q#当前系统15分钟平均负载值与告警值进行比较(当大于告警值0.70时会返回1,小于时会返回0 )
0 D$ U4 a* J% C) L: T0 ?4 n- @load_now=`expr $average_load \> $load_warn`
1 p5 b% l# F- j% [" C; A! I
& m4 z  i0 E# E" H8 C7 A, ~' ]#如果系统单个核心15分钟的平均负载值大于告警值0.70(返回值为1),则发邮件给管理员 / z4 W' N) ?2 f8 a; E( k* @
if (($load_now == 1)); then 8 f9 _/ v; S0 P. u$ i" h
    echo "$IP服务器15分钟的系统平均负载达到 $average_load,超过警戒值0.70,请及时处理。" | mutt -s "$IP 服务器系统负载告警"  fuquanjun@xxx.com
3 S& R, J5 [# Q/ X7 O fi
. {" F% o4 a2 Tfi
3 j: {3 F  D6 i# v # chmod a+x /scripts/load-warning.sh
9 C1 O8 j3 _( w7 H, n* ^, Z三、监控服务器系统cpu占用情况:
1 q2 C$ f6 U# z6 s; M$ @0 T: k! p, g0 ~0 q
1、使用top命令查看linux系统cpu使用情况:
, O3 D6 w0 X$ ~$ `复制代码代码如下:
+ |; {2 |+ v0 x% j8 [8 t
5 Q# O; j  x, p7 E3 ~#  top -b -n 1 | grep Cpu   (-b -n 1 表只需要1次的输出结果)
' m; a0 c& {1 d3 Z& D2 s     Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st9 b' E6 v$ t7 C4 ~7 D1 {
/ Z. L2 s9 C3 ]# r: D
2、查看截取空闲cpu的百分比数值命令(只取整数部分):8 s1 A# M$ _: w1 W% R+ b1 q
复制代码代码如下:
$ z2 D  j7 n6 O% }! P" P9 q+ Q2 ^. e
# top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."
" U( ~/ I% p/ d$ Q9 J. R1 k7 I* P6 F9 M
3、编写cpu监控的脚本文件:; B! a! B+ C7 D* s
复制代码代码如下:3 w5 @$ i7 S; u5 G. j
8 H* [7 h1 R0 E6 D' E
# vim /scripts/cpu-check.sh
+ Z8 x! d/ g0 q( Q) g. A#!/bin/bash
1 b; z( o8 h) h, a#使用top命令监控linux系统cpu变化
3 a8 ^" {1 f8 p5 Y
7 }# X% A( B; U2 j) ?#取系统当前时间(以追加的方式写入文件>>)
- E- r" j; ?. G% ndate >> /scripts/datetime-cpu.txt   
4 s/ {6 y9 H* G# [3 l, k  w$ A $ B# F" z% ]; x/ g& \& }: U
#抓取当前cpu的值(以追加的方式写入文件>>) / \# P+ e( b7 s/ ?5 y
top -b -n 1 | grep Cpu  >> /scripts/cpu-now.txt  $ Z: U7 t) w2 k$ j6 h& P8 [$ {7 X
  P3 E( S$ Z7 C2 b0 P
#逐行连接上面的时间和cpu相关行数据(每次重新写入文件>) 7 f9 w( h" v. P
paste  /scripts/datetime-cpu.txt   /scripts/cpu-now.txt  > /scripts/cpu.txt- _; ^9 O( u  d& H
# chmod a+x /scripts/cpu-check.sh; j5 P: |" G: p
4、查看CPU监控的结果文件:
+ ?) N( E. ^5 |. d4 k复制代码代码如下:
! k- u% ]/ D1 z) s  I: d% N
3 _% ^- I' x, `! f! a' J# cat /scripts/cpu.txt2 S4 O& G- n( D" v4 m! }0 U

: i1 E9 {9 i) W+ O0 N$ X6 E0 H5、编写cpu结果文件邮件发送脚本:" }: G% a7 B; k+ e) b3 G& T
复制代码代码如下:
3 `) B; J( @3 Q; a# V; M1 s# K6 Y; V# v
# vim /scripts/sendmail-cpu.sh
: Y$ I% o# R* l" a( y#!/bin/bash
, b' T  A9 U- D5 M& P  [#把生成的cpu.txt文件通过邮件发送给用户
/ [4 ]8 L  @  t& d/ b6 a4 V: ?/ M9 N4 K 8 ^6 e% {! x% ?( E% U3 A) l. z
#提取本服务器的IP地址信息 6 u  Q6 M8 K' T+ E& e4 S
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
+ B" m3 y" J- n 9 Y6 _& P# V) }( M. {
#提取当前日期6 v5 @! `4 S. ^- p6 @& a. m% D; @2 Q
today=`date -d "0 day" +%Y年%m月%d日`
! R# L- H- Z9 Y+ e* e, b9 K$ q
$ U4 o7 j9 v3 \2 R#发送cpu监控结果邮件 ) T% s0 }8 c5 n' P$ M
echo "这是$IP服务器$today的cpu监控报告,请下载附件。" | mutt -s "$IP服务器$today的CPU监控报告" -a /scripts/cpu.txt  fuquanjun@xxx.com! D7 c2 `3 V" p2 ^
# chmod a+x /scripts/sendmail-cpu.sh, x. q6 n- A4 t% |) ?# v

% U( n6 ^! R0 ?6 c' s( ]四、监控系统cpu的情况,当使用超过80%的时候发告警邮件:
" l% [  e( ]1 N0 k# i, G6 ^# B# w$ p& e, o# z6 m
复制代码代码如下:
, z' k5 D  N- h4 M2 V* L! k; k7 a- u1 l" H; p8 b
# vim /scripts/cpu-warning.sh
/ s7 y; T( u; s, I; q#!/bin/bash
8 l8 G" a" i& |. `0 x#监控系统cpu的情况脚本程序 0 [) U1 z% m) ~3 K4 O0 S
& ^( Z  o3 R6 v$ g# E+ b
#提取本服务器的IP地址信息
; N# }- o0 _! b$ QIP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` 3 d2 T* d* a% y

: j! P- A7 J. \& f# n$ m: [#取当前空闲cpu百份比值(只取整数部分) 8 w$ f& v& W# W' I' W+ V1 s. n
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."` 4 I5 G8 V7 G/ G: S9 ?+ x$ _
% W  V! l$ f/ P2 y7 h# A
#设置空闲cpu的告警值为20%,如果当前cpu使用超过80%(即剩余小于20%),立即发邮件告警
2 Q: c' o0 d; _0 C4 b3 Y3 nif (($cpu_idle < 20)); then
  h- M3 w# U. a: ]3 |& k      echo "$IP服务器cpu剩余$cpu_idle%,使用率已经超过80%,请及时处理。" | mutt -s "$IP 服务器CPU告警"  fuquanjun@xxx.com
8 ?7 `$ p% L; L( g( R& I* lfi# Y3 I& Z$ G& h' j* s
# chmod a+x /scripts/cpu-warning.sh
 楼主| 发表于 2023-9-16 22:40:01 | 显示全部楼层
在Linux服务器上安装sysstat
为了使用pidstat,你需要安装sysstat包,如下所示。
在Ubuntu、Debian或Linux Mint上安装sysstat:
$ sudo apt install sysstat
在CentOS、RHEL或Fedora上安装sysstat:
$ sudo yum install sysstat
从源码中构建sysstat
如果你的Linux系统上没有sysstat包,你可以很容易地从源码中构建它,如下所示。
$ tar -xf sysstat-12.5.3.tar.gz
$ cd sysstat-12.5.3/
$ ./configure
$ make
$ sudo make install
使用用pidstat测量一个进程的平均CPU使用率。
安装了sysstat之后,可以使用pidstat来测量Linux进程的平均CPU使用率,具体如下。
$ pidstat 5 -p 11579
在这个例子中,我检测了一个PID为11579的Linux进程的平均CPU使用量,测量时间间隔为5秒。这条命令将每五秒刷新一次CPU平均使用率。如果按Ctrl-C键,命令将退出,并打印出整体的平均CPU使用量。输出显示进程平均消耗了5.5%的单个CPU核。%CPU旁边的CPU字段表示进程所连接的CPU处理器ID(如果系统上有多个CPU处理器)。%usr和%system两栏分别表示CPU有多少是在用户空间或内核中执行的。
注意,你需要提供间隔参数(例如,5),它指定了每次报告之间的时间间隔,以秒为单位。如果没有间隔参数,pidstat报告的%CPU将是自系统启动(启动)以来的平均CPU使用率。
使用pidstat测量系统中进程级CPU的使用情况。
如果您想测量所有正在运行的进程的CPU使用率,您可以简单地在pidstate中使用-p ALL选项。
$ pidstat 60 -p ALL
上面的命令将每分钟报告所有正在运行的进程的平均CPU使用率。
* u! R( _0 q# W" W' H" k$ H
  _5 L, A4 J- `( Q# Q: U
#!/bin/bash/ ?8 y, w5 w& `

0 p0 d( g) r# \. Koutput=$(timeout 60.1 pidstat 60 -p ALL)
: N3 V5 W$ W. E
, L# A; I$ k% i9 n% F  R  yIFS='
4 G' Y7 q- V$ D' i1 i) n/ J, f# s* C; ^, F3 S+ e4 \
'! j* O: k% \# ^6 s/ k& s
) w7 J% X! J, {/ x, u6 E
for line in $output; do2 \/ p* T7 r, l5 t# W

+ K4 W" h. D3 r2 p% f- N4 Y    # extract N-th column with awk& F* D$ b1 [% y
4 p3 s$ [2 {* ^0 ]
    pid=`echo $line | awk '{ print $4}'`    # PID( F1 V% K9 [6 ]3 r5 `" Y
) T$ u' S  R5 A& W9 ^7 Q
    pcpu=`echo $line | awk '{ print $9}'`   # percentage CPU7 m. T6 Q2 R& C& W  R" t# h( C

3 T5 R" p( `) A' g    cpu=`echo $line | awk '{ print $10}'`   # CPU ID3 }7 d# T1 \0 y( N, f9 `0 l
; a: m5 w6 L5 S9 B# N6 z" ]
    cmd=`echo $line | awk '{ print $11}'`   # command. t, U! m1 Z! \5 Y( s

( ]/ C5 N5 j5 `  I. o    echo "$pid $pcpu $cpu $cmd"' g7 b' S( t7 L2 D6 v  W( Q

3 |' `% F$ l2 a- ?6 p' @, Vdone
 楼主| 发表于 2023-9-16 22:42:49 | 显示全部楼层
$ top -bn1 | grep load | awk '{printf "%.2f%%\t\t\n", $(NF-2)}': ?/ q  ~8 S, Y9 @1 f. z
1.30%                2 S3 k& v3 B& n
0.10%               
- W; q; M1 m6 }4 Q3 {# H0.00%                , M5 b+ m& I/ B% }4 O( d, Y  R: x7 J

: @: _6 H6 n: N* z! k$ top -bn1 | grep load , d( P  a6 f* f- X4 ?' k7 ^
top - 22:41:46 up 23:08,  2 users,  load average: 1.30, 1.28, 1.34
/ _9 q! ^1 X2 g, P  X" [  2089 root      20   0  385436  14672   9064 S   0.0  0.1   0:05.97 lloader
' X7 l4 y* ?  ]6 U, k  2090 root      20   0   81668   3904   2936 S   0.0  0.0   0:01.08 lloader+ N6 a+ s; U; I7 v
 楼主| 发表于 2023-11-10 16:26:47 | 显示全部楼层
# vim /scripts/load-warning.sh8 x$ j' @: g8 P7 N+ ?# Q
#!/bin/bash : t2 @8 o+ |$ n6 P
#使用uptime命令监控linux系统负载变化 3 T; C5 A; |9 d1 d* ~& B0 o) x; ?

' y1 {* B" W  H+ o#提取本服务器的IP地址信息
2 M: @0 Y/ a, r6 z2 S" X! uIP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` 6 u, p- B7 {4 z$ o
) O8 I( ~+ ^& \/ P) I
#抓取cpu的总核数 . p4 U4 Q  j/ X8 J
cpu_num=`grep -c 'model name' /proc/cpuinfo` / [3 M# q6 L; m8 d) B% g
. u8 B" v8 n! ?0 q% \% j' g
#抓取当前系统15分钟的平均负载值
5 |- _# h  w7 X0 w+ ^4 B" {, wload_15=`uptime | awk '{print $NF}'`
! J$ P% |3 |' Q# ^
1 J1 \- w/ C3 q* Y  Y. i8 C7 s#计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。 ( e8 ]2 c( e! t+ ?( a
average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc` . I" _) T2 S3 w0 O& q* a( f# r4 Q
: T# c% X, X8 o- `2 Y2 ~2 t7 \
#取上面平均负载值的个位整数 . j* [9 N1 G( v6 |/ X
average_int=`echo $average_load | cut -f 1 -d "."`
# b2 q( F% l7 O5 y$ B+ e/ i2 y9 t2 t$ ]
#设置系统单个核心15分钟的平均负载的告警值为0.70(即使用超过70%的时候告警)。
7 ~! s6 f$ t7 y# nload_warn=0.70
8 v4 B0 Y" H3 g. f4 R2 r4 n" I! R' F& \. K
#当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0) ,直接发邮件告警;如果小于1.0则进行二次比较 4 {0 A4 ~% y$ C! m2 h" f5 r1 S
if (($average_int > 0)); then 1 L: B% i8 n& x! v
  echo "$IP服务器15分钟的系统平均负载为$average_load,超过警戒值1.0,请立即处理!!!" | mutt -s "$IP 服务器系统负载严重告警!!!" fuquanjun@xxx.com
' u* V8 J! d2 b0 L) ?  else
9 G  f5 I! J3 K7 ~3 l#当前系统15分钟平均负载值与告警值进行比较(当大于告警值0.70时会返回1,小于时会返回0 ) % f  \0 l/ |- k
load_now=`expr $average_load \> $load_warn`
8 C2 {% o- Y6 Y9 s- m) k* ~- w$ _( A2 d
#如果系统单个核心15分钟的平均负载值大于告警值0.70(返回值为1),则发邮件给管理员 0 T' q  U3 d" _, g* C- e* i
  if (($load_now == 1)); then & P  G/ S2 L# I% }
    echo "$IP服务器15分钟的系统平均负载达到 $average_load,超过警戒值0.70,请及时处理。" | mutt -s "$IP 服务器系统负载告警" fuquanjun@xxx.com! B7 [  Q' F9 {0 H& L$ X! h
  fi - F: h1 ?) D3 L6 j( J4 F3 n
fi; Q; |) B$ g+ H6 c
# chmod a+x /scripts/load-warning.sh
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:30 , Processed in 0.056760 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表