找回密码
 注册
查看: 437|回复: 6

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2023-9-16 22:28:49 | 显示全部楼层 |阅读模式
在Linux系统中可以通过/proc/stat文件来计算CPU的使用率。其中各项参数说明:
4 |- k1 \! Z+ w( N0 v9 Q! a2 @( J6 q' [/ s7 A
cat /proc/stat ( s# A: }& o3 @
cpu  8742195 15 754479 55626730 192455 0 32760 0 0 0
" ]5 F1 C" V+ n& `, }) L: Vcpu0 326672 0 97560 7716403 21364 0 7494 0 0 0
4 H: Y$ _2 B7 l2 h; @; Ucpu1 230096 2 109184 7784794 24447 0 5431 0 0 08 O, Y) _: W  w' s) J, n4 Q
cpu2 2498253 0 80762 5566047 26575 0 3556 0 0 0
  s9 \$ k( W" M$ B# Xcpu3 2733988 0 76288 5345517 18368 0 2986 0 0 05 M. f5 J) T) R: z& ]% S
cpu4 1268765 2 93512 6772088 32527 0 3460 0 0 02 i+ a% ^* m; V$ q3 S8 ~
cpu5 577480 0 100944 7466708 19525 0 3660 0 0 0
' g8 h' [, Y2 Ccpu6 575574 0 99252 7464805 24467 0 2785 0 0 0/ }# k5 I* l8 D) u. y
cpu7 531364 9 96973 7510365 25178 0 3384 0 0 06 t0 X; m& f1 m7 L# \, H
intr 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
) u+ x/ }( y6 o/ W& u3 z$ fctxt 374979507* V" T! `5 I( x% T  u
btime 1694791989
  B% m! H5 ]# Z+ i  zprocesses 22348721 f. f( K* N8 b4 p0 A& l1 f
procs_running 41 M1 [; |8 k5 f9 p* p, W
procs_blocked 08 G6 t/ H8 d9 D( ?' t
softirq 279664532 1 159117851 16412 20782044 785020 0 41986 18593620 0 80327598; S" r7 l2 i. B$ S, m+ r
; p0 Z5 S; B. z' Q0 `" j% I

1 q6 |* b( T& f; N( p
3 s+ N+ e5 P4 [- ^3 S# @
) R* L4 `* z4 {4 m; a就拿第一行来说:4 i- a) E& N5 u1 P/ X4 p8 {
/ J/ K7 K6 K! [/ T
   cpu  8742195 15 754479 55626730 192455 0 32760 0 0 0
) d* d4 ~) }, O$ A& g' U! n: O8 S% G5 ^

2 s( @2 [1 y: [# a& j" ~第一个字段(cpu)是cpu标识。' m  Q8 r. C+ w, Q* P
2 Z2 j( r* w7 K1 e
第二个字段(8742195)表示是从系统启动开始一直到当前时刻,进程在用户态(user)下执行的时间积累。
* d' z4 e+ V* E! @0 Q
& ]% i8 v2 G3 y8 \* N第三个字段(15)表示是从系统启动开始一直到当前时刻,nice值为负的进程所占用的CPU时间。
$ k, v. E! w! |6 u1 T% n9 `
( }# m! y9 x+ i/ _' R- d第四个字段(754479)表示是从系统启动开始一直到当前时刻,进程在系统内核(system)的执行时间积累。
- K, U- x  Z! i6 r3 |
0 L% S( U4 f' g7 I, y& F第五个字段(55626730)表示是从系统启动开始一直到当前时刻,处硬盘IO等待以外其他的空闲时间(idle)积累。
/ O& w9 v& v/ f3 X1 K$ y0 b- p2 l. I
第六个字段(192455)表示是从系统启动开始一直到当前时刻,IO等待(iowait)的时间积累。
) V0 v0 j, F9 Z( K6 w  J
: j: N& H4 U! }第七个字段(0)表示是从系统启动开始一直到当前时刻,硬中断的时间(irq)。4 b" W( D- j! L' A1 B; O/ U
% I" e- ?3 N' h+ t2 t- G: k! ^
第八个字段(32760)表示是从系统启动开始一直到当前时刻,软中断的时间(softirq)。
" {- ~+ R1 l3 P3 a' }  g2 c- ~: ^' \; ?
剩下的几行:
; Z. h$ @0 b8 }  N6 F& @0 H& d
! G6 N0 g5 N' W5 M8 G) M+ d! `* _intr: 给出的是中断信息,第一个数为自系统启动以来,发生的所有中断的次数;后面的每个数对应一个特定的中断,表示该中断自系统启动以来发生的次数。
4 L" A+ ?/ K" Z( _! i/ H1 F- \2 z' s* Z/ x
ctxt: 表示系统CPU发生的上下文交换次数。
( Y, ~6 c# |) j* ~# b2 k' q) [8 t  R# F  H5 V/ I! j9 P' p/ V+ o
btime: 表示自系统启动到现在的时间,单位为秒。
5 T1 x: _8 H* z7 V2 d3 X% a/ E& l2 x6 |& J8 q1 J
processes: 表示自系统启动以来所创建的任务的数目。; n7 H4 Q9 K  a$ s. X
6 f3 @$ w2 j  X. ~/ B1 X7 m
procs_running: 当前运行队列的任务数目。
9 C5 h( R7 q1 h: C' Y
* O/ C- p3 P, d$ L: Y& G3 M2 aprocs_blocked: 当前被阻塞的任务数目,等待I/O完成次数。4 j: F# r0 X+ ~# }8 c

/ d" L8 v* n9 ?# A1 `CPU的使用率可以通过如下方式计算:) P6 I/ m4 `4 X5 B- j
& }; P4 Y5 L" ^& x# r! p& p7 t
cpu_usage=(idle2-idle1)/(cpu2-cpu1)*100( w4 x! s" N( |

- b+ Z; L- h1 Y2 {; @2 l) Ucpu_usage=[(user2+sys2+nice2)-(user1+sys1+nice1)]/(total2-total)*100
7 L# O" D6 x- r7 G9 J; z3 M% q. I+ R
获取CPU使用率的相关脚本如下:7 Q2 v& E* k! o. p# \! C
& V3 D1 O6 ^6 F; x" s* m

' g6 O* d8 R6 z' D( [登录后复制
( j* b+ t# p7 \" c" U: F) m#!/bin/sh( a- i) \9 L* G% n
#
" M9 h2 Z. a1 X- s6 I' v#脚本功能描述:依据/proc/stat文件获取并计算CPU使用率5 g9 E4 ~) |3 p; n- k
#6 A; k* M+ }/ d) P2 I  t8 x
#CPU时间计算公式:CPU_TIME=user+system+nice+idle+iowait+irq+softirq( z! G* I4 @/ `! {( A1 Z
#CPU使用率计算公式:cpu_usage=(idle2-idle1)/(cpu2-cpu1)*100
" Y  u  J. X" s! I: q; i' n#默认时间间隔
4 `& @5 v* O5 g# F, YTIME_INTERVAL=5
* e  O4 Y) {. f' h2 M3 |$ Y6 F1 I/ X( O$ w
LAST_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')
  L8 Z5 L5 S) n" VLAST_SYS_IDLE=$(echo $LAST_CPU_INFO | awk '{print $4}')
. e" J8 S. m4 N  rLAST_TOTAL_CPU_T=$(echo $LAST_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')
% b% c' Q- r( u7 h! l( h+ x: @sleep ${TIME_INTERVAL}
/ Z3 d0 ]; A. p3 n/ f: _NEXT_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')
2 [2 F4 o! c+ n2 CNEXT_SYS_IDLE=$(echo $NEXT_CPU_INFO | awk '{print $4}')
, b6 e+ F9 }. o, kNEXT_TOTAL_CPU_T=$(echo $NEXT_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')
1 d9 N4 Y) }9 E8 v) Y' g4 R! ]( B5 Y
; N1 a' `3 u. S; a#系统空闲时间/ E6 x, X0 m3 ~' e" o) O$ P$ C
SYSTEM_IDLE=`echo ${NEXT_SYS_IDLE} ${LAST_SYS_IDLE} | awk '{print $1-$2}'`' s& a8 L' ^. t  X; H, m# \
#CPU总时间" J! Y( G0 [6 \/ |3 X  _2 z
TOTAL_TIME=`echo ${NEXT_TOTAL_CPU_T} ${LAST_TOTAL_CPU_T} | awk '{print $1-$2}'`
: P/ e* t1 u1 ]0 dCPU_USAGE=`echo ${SYSTEM_IDLE} ${TOTAL_TIME} | awk '{printf "%.2f", 100-$1/$2*100}'`5 S8 ?# E2 v) n0 U" s* L4 y: I
! L% Q# N8 ~1 U; G/ @
echo "CPU Usage:${CPU_USAGE}%"
* f/ Q9 \: I. w0 F
6 o5 c& x, X; T3 k) c/ ~# y1 k" C3 S) ~( L5 q% }" e/ @* C7 q
+ N0 j7 N' ]: d
9 w  ^& g6 z- z& z9 \; b/ Z
[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'
* R. W9 f) N4 j! j4 I% I14.9) Q4 s' F  `9 r! a
[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)'4 h' ]; c, v  G1 N; ^# X
%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 K8 l9 x/ A" N' c" t6 ~[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'
6 J  n  {' e2 w27.0
, b& p) b2 L$ a. H7 E  ~( t& X6 t$ X" c* a
for循环脚本:
& J$ G0 o& @- X6 Jfor((i=1;i<=5;));  7 z* \# E7 o* L# D
do   
' H5 K' U( c4 }2 c" h0 F, t3 C    cpu_us=`top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'`
6 Q. a, N* i+ C6 \! f    cpu_sy=`top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $5}'`4 L. v% |3 f" |2 u. J: M9 Y
    #echo $cpu_us
9 L: T$ h9 R! X    #echo $cpu_sy- v% f- v5 l8 L' B# v0 Z7 l$ y
    cpu_sum=$(echo "$cpu_us+$cpu_sy"|bc)
' S$ A! ], [% E: R' i    nowdate=$(date +"%Y-%m-%d %H:%M:%S")9 s/ T/ m0 m  K1 b6 T7 H! I8 h3 Y  \
    echo "$nowdate CPU_SUM: $cpu_sum%" >> ./cpu.log( |. D2 b$ b, Y* j
    sleep 120
/ O1 x( J4 o$ z% R) R) Wdone8 l. \% }8 w3 C0 j5 g4 a
" i* P2 {) p0 n! S1 Z7 ^7 ]- z
% M# {" o: Q" s# d2 |; L

  U2 d7 p% s* Q7 ~2 j( `, T8 [6 snohup sh cpu.sh >/dev/null  2>&1 &0 o/ s+ Y; f; j  O; i

$ g+ j% w4 |1 j( u3 z( I

6 G! n" H( h+ {/ W' N
6 H+ }4 P/ {$ A( B. M  n+ d1 U: r$ p
$ {9 ^8 [. X/ P% D  J+ c
$ i* j6 @9 V8 m( ]+ ?. v5 G1 A3 d
  X9 ~# \9 S: f; t4 w1 w, B5 y
. ?3 C# }# |: ~$ v

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:32:06 | 显示全部楼层
#!/bin/bash) @# U8 C4 Z) y3 a
6 y  ]( K7 c( p& G! ?. m' g
# 获取ip& }" L5 J0 v' J6 V
ip=`ip addr show eth0 | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print ""$2 }'`
9 w' B+ w. L  |6 [  _/ M  fecho $ip
' o) u' p0 j* }3 n( q+ wip_index=`echo $ip | awk -F '.' '{print $4}'`- ~$ d. Y, ^; b& Q1 \

" Z4 [- t( q5 ~  a0 N# v) B$ P#计算cpu使用率
. X" g# C: }5 z: Z* h9 gcpu=`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;}'`& b) G+ \# z* I1 e, N5 J7 \8 r
echo $cpu" a8 ?4 R, t* b& \4 M! p; X# s$ ^

+ R7 R9 f$ ]* X# r1 L#统计内存使用率0 a6 i. }" T' K# y8 Y3 ^
mem_used_persent=`free -m | awk -F '[ :]+' 'NR==2{printf "%d", ($2-$7)/$2*100}'`. g% k1 ^$ W; M8 v0 M( _- Y
echo $mem_used_persent

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:33:40 | 显示全部楼层
top 参数、含义、思路' a* n9 E4 {/ g% W
查了一下top的参数, -n 参数的意思是 刷新一次就停止(只输入top 是会一直在刷新的)4 ^4 w1 d" @  j  M8 v/ D3 [- v% i7 ^
Cpu 这一行有很多个参数,每个参数都有自己的含义:, H$ V2 v  i+ c7 u0 e
us 是用户空间占比
" e! B0 z3 M& A! A6 Dsy 是内核态占比% x7 G1 ]# G9 V; i( w; J
id 是空闲占比
9 Y8 Y+ F7 _& K4 [% H& I还有其它的都是各种场景的使用占比# q6 i0 Y/ V; t
所以我们是取出 id, 然后 100-id
9 T! H1 ?; `8 j9 H' B& N; |
/ p( b' m( Q4 o+ }/ G

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:36:19 | 显示全部楼层
2个CPU表明系统负荷可以达到2.0,此时每个CPU都达到100%的工作量。推广开来,n个CPU的电脑,可接受的系统负荷最大为n.0。
' \# B* i6 l: t- c6 X2、查看服务器cpu的总核数: @: l( |# Z& A# ]& M0 W) Q+ A! }$ B
复制代码代码如下:
8 M, E- `7 ~' |, J; x; C& P* a# Z$ J' s3 W. T# n
# grep -c 'model name' /proc/cpuinfo  或者       cat /proc/cpuinfo
$ p- v9 W9 u. @$ m7 j( g; L8 `' D; M2 }
3、截取服务器1分钟、5分钟、15分钟的负载情况
. ]2 a9 _. T1 K2 m* s9 I复制代码代码如下:
" {# Y' V0 h% B' E/ U9 A' h1 b
3 z/ }5 _6 O- X+ L# uptime | awk '{print $8,$9,$10,$11,$12}'+ n3 k2 |3 j" t2 O0 d5 r1 v' h2 @
   load average:  0.01,    0.02,   0.004 E1 T. @6 ^0 U
4、查看截取15分钟的平均负载
; C# F& t: @. a$ f* L
$ }3 y0 Z6 }# f4 B复制代码代码如下:
2 {& T  S0 y+ y) D5 y) }0 {2 N; Q" D
# uptime | awk '{print $12}' (用 '{print $12}' 这个获取的不够准确,如果都用awk取第12个字段的话,结果有可能为空了。而用$NF表输出最后一段的内容)
' \7 z$ K" h9 ?5 R8 L9 s; m- N# uptime | awk '{print $NF}'
; |  ?! n. P0 u, _% J2 ]
. y8 G8 ~) e& c  q) A5、编写系统负载监控的脚本文件:
5 P. s5 `, X+ T& b复制代码代码如下:2 n& P6 v, o+ J' S2 b# L

8 x9 k- W' P$ H' y# vim /scripts/load-check.sh
# C3 F4 {5 F, X! g$ [* \- R, x[code]2 P% }+ f# F* }" ^* [$ O7 t: W6 C
#!/bin/bash 3 l4 V3 B4 M0 U& k" n9 X
#使用uptime命令监控linux系统负载变化 5 `3 ?$ {  ~9 \& j' @( N
" m* Y* a( |  O# D% o+ V5 X' h, Q/ l
#取系统当前时间(以追加的方式写入文件>>) : u" E( j1 r" T/ d6 ]
date >> /scripts/datetime-load.txt   
" F5 U  i' e6 {! J
( H, `, u$ @7 }$ p#提取服务器1分钟、5分钟、15分钟的负载情况
6 R+ e1 n0 L7 Guptime | awk '{print $8,$9,$10,$11,$12}' >> /scripts/load.txt 0 E, S, L; K1 K- I' y

* [% |' o6 q9 b/ U5 p* L#逐行连接上面的时间和负载相关行数据(每次重新写入文件>) 8 h* ^. u5 y% g" I3 p
paste  /scripts/datetime-load.txt /scripts/load.txt   > /scripts/load_day.txt7 n  X$ G" G2 z$ Z0 a# V
# chmod a+x /scripts/load-check.sh9 ?8 r6 j3 ~! V9 q6 B$ K
6、编写系统负载结果文件邮件发送脚本:% R) U1 m4 p4 v, B
复制代码代码如下:
7 Q- ~% t9 D5 ]' Q& e5 r
( z9 {* l2 v2 }8 x8 l& C1 U# vim /scripts/sendmail-load.sh
3 [" d$ s* {: r2 }, Z#!/bin/bash & _  O, B% R3 L' u
#把系统负载监控生成的load_day.txt文件通过邮件发送给用户
: i) `7 Q. V# }; V# s ; M2 B4 t4 T" p& \. q& C5 M" l
#提取本服务器的IP地址信息
# v* N! z. {6 R5 q2 D0 a" E2 S) {( jIP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` 2 m* P5 r; W; p5 v

4 G" W$ ~4 |* S8 d) k  U2 Y#提取当前日期
5 g0 i& F1 L, ^* Dtoday=`date -d "0 day" +%Y年%m月%d日`
; P" I% y$ y9 [: y% V) R! j
: m! L6 Z& q2 K0 Z( n; h# W2 D#发送系统负载监控结果邮件 1 s8 n6 O, z, C9 d
echo "这是$IP服务器$today的系统负载监控报告,请下载附件。" | mutt -s "$IP服务器$today的系统负载监控报告" -a /scripts/load_day.txt  fuquanjun@xxx.com
4 `5 i1 o' v0 P" j# chmod a+x /scripts/sendmail-load.sh
2 l8 o8 \# C; n; p; _4 R( ]7、编写系统负载监控的脚本文件:
: q/ l- o4 n! q  X9 C% m复制代码代码如下:4 k0 p3 I# j' w$ @1 s' ]% D$ E

& y" d9 a; v! E* C) c1 z- @5 C4 S# vim /scripts/load-warning.sh* B" L  p/ G) D5 f$ ^0 O8 Y
#!/bin/bash
/ b- Z6 f# ~9 t3 w. y#使用uptime命令监控linux系统负载变化 8 k# `7 c/ d( U% m; b. p* F
5 G6 D, {4 P# x6 X/ y' @( a
#提取本服务器的IP地址信息   J$ h9 `) ]7 f9 U& b! y, e6 ^% P2 M
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` : f6 a& L! m" z! Z' P' M, `
, k& L+ Q! }1 g
#抓取cpu的总核数
: s/ P( m0 V) h4 v8 k! l6 Wcpu_num=`grep -c 'model name' /proc/cpuinfo`
  k; W& C% F' z0 i/ M) d+ K5 V
) j, p( r# |4 S0 t#抓取当前系统15分钟的平均负载值
6 a. j5 k6 C0 I2 cload_15=`uptime | awk '{print $NF}'` 6 H9 u$ K7 p$ w/ S

  J; t. B& I0 ~6 J$ }% q$ U  Z5 c#计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。
2 Z( x0 D% U, waverage_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc`
5 U& O' p8 o9 k: j6 `4 e8 |8 i3 E/ E
& k' u/ x+ |; P+ r5 z#取上面平均负载值的个位整数
9 w% Y* K5 t+ r' L9 F. i: A  `average_int=`echo $average_load | cut -f 1 -d "."`
( N2 W. M- }8 p   ^) y* D! P, b% e1 B7 S
#设置系统单个核心15分钟的平均负载的告警值为0.70(即使用超过70%的时候告警)。
" P8 }- i! E/ _9 \$ A6 yload_warn=0.70
  ^; `- ]" n# l. u6 A% b
+ ]% y4 D9 e; c' m#当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0) ,直接发邮件告警;如果小于1.0则进行二次比较
) U7 p7 z# u; \5 P' nif (($average_int > 0)); then
& G* z; h# |! d# f" k! l  o9 j      echo "$IP服务器15分钟的系统平均负载为$average_load,超过警戒值1.0,请立即处理!!!" | mutt -s "$IP 服务器系统负载严重告警!!!"  fuquanjun@xxx.com + s' A, }' M7 H- K
else ( R$ j: N( Y) C; Y2 R
#当前系统15分钟平均负载值与告警值进行比较(当大于告警值0.70时会返回1,小于时会返回0 )
: J$ L9 t9 G2 ?0 {6 Z+ Cload_now=`expr $average_load \> $load_warn` : k0 Y8 s$ M% B+ X

! q2 O( V" K$ U8 R3 m% Z  O#如果系统单个核心15分钟的平均负载值大于告警值0.70(返回值为1),则发邮件给管理员
$ u8 z! B! H+ q  y- T/ G* t if (($load_now == 1)); then
3 t& @6 q/ b5 l2 T& }  Y" z  m    echo "$IP服务器15分钟的系统平均负载达到 $average_load,超过警戒值0.70,请及时处理。" | mutt -s "$IP 服务器系统负载告警"  fuquanjun@xxx.com , V) [2 v  m) j1 o
fi " f7 a& d1 A4 X. x3 b( x% J$ t" H
fi9 D% j* a5 G5 v& H% t6 c
# chmod a+x /scripts/load-warning.sh
% E* H2 P" B1 R) U5 `" K三、监控服务器系统cpu占用情况:
1 c5 W- s- f4 L0 G; @3 \+ T* J" k( z9 t9 i0 b5 B
1、使用top命令查看linux系统cpu使用情况:
8 l/ \/ M, Z; z0 S1 H, H" n复制代码代码如下:- n8 k2 A. z  R& O* Z7 H$ {

/ _: L, H8 }9 Z  z( N+ \- v) h" q#  top -b -n 1 | grep Cpu   (-b -n 1 表只需要1次的输出结果)
' g- u4 q0 l" b4 r! t8 D     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%st1 u2 P% d9 M' j$ x, D1 N" p% [

8 \. C( G0 s3 `/ L/ z1 @2、查看截取空闲cpu的百分比数值命令(只取整数部分):
9 d# R0 H2 T4 F& i. x复制代码代码如下:, |& T  I" C1 {* T7 b* R4 x
) h1 _. ^! Q( y' A; S9 Y
# top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."/ l, }4 M7 \5 x: F
4 r5 n: n3 H# P- B# |1 J
3、编写cpu监控的脚本文件:
$ v+ z; x% a6 ]$ G复制代码代码如下:
8 X/ s: d3 q7 e2 ]  ^; ^' k$ w. r, z. @" \
# vim /scripts/cpu-check.sh) o! t* Q$ N+ k+ m
#!/bin/bash 6 W$ m" z- [8 d% }8 W5 n% Y
#使用top命令监控linux系统cpu变化
% x1 @4 u8 u1 N4 W3 i! O% I1 @$ o
7 E- t4 q) N* \) Z" J0 g& r#取系统当前时间(以追加的方式写入文件>>) * \3 L: C2 b# p5 w3 U2 M8 H
date >> /scripts/datetime-cpu.txt   
, C8 ?' Y8 _: ~/ k8 d
" P/ ^3 T+ a# `7 l+ E+ T+ B* V& H#抓取当前cpu的值(以追加的方式写入文件>>) 7 T* t  T- ]! x8 s: Y# U# |
top -b -n 1 | grep Cpu  >> /scripts/cpu-now.txt  
/ J2 Y+ a, Y- A, \ ( u: o" h4 O! m2 o' t& W
#逐行连接上面的时间和cpu相关行数据(每次重新写入文件>) . }6 |2 I( {0 I
paste  /scripts/datetime-cpu.txt   /scripts/cpu-now.txt  > /scripts/cpu.txt
  a0 _9 W- }* @+ ^8 Y* S% j4 j2 `# chmod a+x /scripts/cpu-check.sh# X4 i. v/ \. W. e
4、查看CPU监控的结果文件:% U2 x6 ~. H) R6 Q
复制代码代码如下:
# U0 i; j- S9 v# F' d+ g$ ]) s2 E' O
# cat /scripts/cpu.txt
) f3 Z, p/ r4 v  J; w- f
: ]! w( E+ @* G) [5、编写cpu结果文件邮件发送脚本:
+ H$ j7 S; [+ D3 }& ?# O复制代码代码如下:
0 |2 w( ?  {# Y- m: G5 D! l1 S; n4 y% F. _& _1 x! Y# i& i2 C
# vim /scripts/sendmail-cpu.sh" K( Y+ m0 E% B# E/ P5 ^) G
#!/bin/bash % [, g8 c/ x* d3 `: [4 g
#把生成的cpu.txt文件通过邮件发送给用户 5 `" x0 {3 ~' q

( \  C+ A1 z( L, N! x8 [, h" I1 ^#提取本服务器的IP地址信息 " R' {1 ^' J& T0 P7 F$ A. R2 E" p! f, R
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` ( @  }( ~' H% a& q
& B6 J# j5 @) J- C9 Y; n$ V- X
#提取当前日期
/ p/ e3 ^: i  {: Wtoday=`date -d "0 day" +%Y年%m月%d日`
0 M* K1 T0 {3 @
0 ^# b. c) Q' q% m  }#发送cpu监控结果邮件
+ g: o( h' T3 h! @# lecho "这是$IP服务器$today的cpu监控报告,请下载附件。" | mutt -s "$IP服务器$today的CPU监控报告" -a /scripts/cpu.txt  fuquanjun@xxx.com1 `% i5 s+ }! W) p) J; U
# chmod a+x /scripts/sendmail-cpu.sh
7 [" o/ z! k( a" W) [$ R & A( X) M1 ?- A
四、监控系统cpu的情况,当使用超过80%的时候发告警邮件:
/ m7 U! I8 r8 L7 o8 C2 g5 J( w# k- `7 f9 l) w3 l6 Z
复制代码代码如下:' h  i% T2 y- [$ l; e4 e

! S' D9 [" _" S# i5 C' c8 a# vim /scripts/cpu-warning.sh
4 k# Q" d2 a! n& V! V( t7 k+ k( Q# h#!/bin/bash ( B6 [; z6 m2 w9 k! _- |  S
#监控系统cpu的情况脚本程序 0 i. G$ Y/ |, \2 I
. x) p& o- p: o& \( k- G/ I
#提取本服务器的IP地址信息 " H7 V4 h) X" f$ |& W$ U- B
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` 7 \. F6 p' n- Y6 l. Z

! l7 Q: S1 v/ t9 ]#取当前空闲cpu百份比值(只取整数部分) $ s& M2 O2 u; ^6 y3 h7 E: k  e. ]1 b
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."` 7 F) h1 ^7 ^5 x' `/ p

, ?, \( {5 F3 W#设置空闲cpu的告警值为20%,如果当前cpu使用超过80%(即剩余小于20%),立即发邮件告警
. S5 r: o' j% Bif (($cpu_idle < 20)); then
8 B# h3 ^$ F8 z) R      echo "$IP服务器cpu剩余$cpu_idle%,使用率已经超过80%,请及时处理。" | mutt -s "$IP 服务器CPU告警"  fuquanjun@xxx.com # W  w  {) L4 I0 A6 h
fi
2 w& N- J+ [6 x# chmod a+x /scripts/cpu-warning.sh

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 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使用率。

3 L, e1 F3 Z- H- H& i  J9 ^- T2 a6 \3 t; i, W. G+ o1 D' i) X  P( d
#!/bin/bash+ a& t% Y- O1 ?' A) ]3 y# ?6 \

) ~, |7 F# M# Joutput=$(timeout 60.1 pidstat 60 -p ALL)
7 ~7 d4 X" N& x) t& k0 L9 W
* ^7 K3 t, x, q) b; cIFS='
7 q% R* j" B- u4 i2 i) P5 M/ G; K: R( @9 F9 i4 I! s; j& A% J
'
/ k& b2 V' i0 r1 g! P- h; o, n9 X# U. D$ l8 d: j
for line in $output; do
! Y0 ?& S5 H6 }4 L# L
1 C+ c1 w$ G& a& d# t  ~5 U* e    # extract N-th column with awk2 L! O$ X- I+ O* Z

+ r# S# [+ s& q" c- X5 c    pid=`echo $line | awk '{ print $4}'`    # PID. f, R$ t* _9 y$ \2 z: M( j4 G

% S+ @4 s  m% ?/ L    pcpu=`echo $line | awk '{ print $9}'`   # percentage CPU
8 a; l9 f, a( S, ^$ h- B. R/ C+ e; E1 b5 }
    cpu=`echo $line | awk '{ print $10}'`   # CPU ID1 r7 K  k* U0 ]* c  q7 L6 _% v! ~$ q
! ~: u& Y0 b! Z' ?+ e8 m3 W9 G2 [2 z
    cmd=`echo $line | awk '{ print $11}'`   # command9 H  F1 ?+ r. v- E$ d7 R* C

7 ]% J* ^) I9 y    echo "$pid $pcpu $cpu $cmd"9 C3 J) p$ c  l  b6 u8 c" O% i
' S$ M2 I- e3 i. m, f2 ]/ y
done

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:42:49 | 显示全部楼层
$ top -bn1 | grep load | awk '{printf "%.2f%%\t\t\n", $(NF-2)}'
+ [8 q9 V4 O+ h; P3 V1.30%                  x/ H# E/ J8 F2 {
0.10%                2 k1 c& E- \6 @
0.00%               
6 E  R+ D* ]" h: L% t' w' j* P$ {8 q
$ top -bn1 | grep load 4 T! _5 ~0 ]+ U7 T# v
top - 22:41:46 up 23:08,  2 users,  load average: 1.30, 1.28, 1.34- F; ~; m" ^/ i( J7 R- ~" G
  2089 root      20   0  385436  14672   9064 S   0.0  0.1   0:05.97 lloader
& @  O, }7 I8 Q( g  u  2090 root      20   0   81668   3904   2936 S   0.0  0.0   0:01.08 lloader! L* k! m2 o6 u9 y' _+ U

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-11-10 16:26:47 | 显示全部楼层
# vim /scripts/load-warning.sh
' z; Y/ g, d4 f& x7 I' N% }. ^#!/bin/bash
4 C! R( P, _6 O  n& n$ h8 @. T' W7 I#使用uptime命令监控linux系统负载变化 6 ^, g1 \+ |  X5 c( E" J2 L

- s. z# D5 p7 p( T- x#提取本服务器的IP地址信息 . i7 }$ |. U/ C" b7 V- R. _, d  d% S
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` 6 {/ \) L* p) W2 K

" B4 W1 w* A4 L5 ^0 a$ H# J$ |#抓取cpu的总核数
/ r3 p9 o7 K1 k) ~: Acpu_num=`grep -c 'model name' /proc/cpuinfo`
: r; b; |% v- H) y- o' `3 D
. ^* N' d0 B/ ]( D#抓取当前系统15分钟的平均负载值   v" C. h: T7 l
load_15=`uptime | awk '{print $NF}'`
& W' j) w  K7 J: K& y
8 q* Q" b3 ^- c; l1 K#计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。
7 y) M$ \* [. P& |# o8 Z# saverage_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc`
1 y0 Z! L2 C" A8 F- S
0 _$ B2 y2 I' E) E, \' c#取上面平均负载值的个位整数
8 f4 Y6 Z# N( O+ ]average_int=`echo $average_load | cut -f 1 -d "."`
! C) K* V! `, d7 u' t$ s! C& v2 v* X6 K
#设置系统单个核心15分钟的平均负载的告警值为0.70(即使用超过70%的时候告警)。 4 Z4 T" i6 ~3 b: L
load_warn=0.70
( [5 t; S; H2 F/ }5 i
0 O5 f+ f* k7 c: K" `2 K#当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0) ,直接发邮件告警;如果小于1.0则进行二次比较
6 Z- u9 ]7 k2 M2 F4 _1 z7 qif (($average_int > 0)); then
, i1 v( u( K" X* L9 }$ @& g  echo "$IP服务器15分钟的系统平均负载为$average_load,超过警戒值1.0,请立即处理!!!" | mutt -s "$IP 服务器系统负载严重告警!!!" fuquanjun@xxx.com 0 B# o8 V" I7 ~6 G8 v
  else 1 a( I9 o7 b  G6 J
#当前系统15分钟平均负载值与告警值进行比较(当大于告警值0.70时会返回1,小于时会返回0 ) 7 g; H  ^" R4 x1 Y) i5 T
load_now=`expr $average_load \> $load_warn` $ Y1 ?8 W1 X( ?. J
) S. ^+ p7 Z) e( |
#如果系统单个核心15分钟的平均负载值大于告警值0.70(返回值为1),则发邮件给管理员 & w) |. Y. V" T+ Q4 N9 y8 Q% }% f
  if (($load_now == 1)); then
$ o( M' C" C1 }2 @# I, ~" r    echo "$IP服务器15分钟的系统平均负载达到 $average_load,超过警戒值0.70,请及时处理。" | mutt -s "$IP 服务器系统负载告警" fuquanjun@xxx.com
1 x$ x$ a+ x" C4 `7 c' F  fi
5 l1 }$ ~9 q" h% Gfi
3 g. o& {6 j0 a- V, Z; Q# chmod a+x /scripts/load-warning.sh
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 00:42 , Processed in 0.018301 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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