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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2023-9-16 22:28:49 | 显示全部楼层 |阅读模式
在Linux系统中可以通过/proc/stat文件来计算CPU的使用率。其中各项参数说明:6 t7 C+ ^1 t5 k

5 Q' B; L. K  ~3 Mcat /proc/stat
8 Z) x. c3 h" a* {2 W& kcpu  8742195 15 754479 55626730 192455 0 32760 0 0 0
% E+ F- f( L* _' R6 gcpu0 326672 0 97560 7716403 21364 0 7494 0 0 0
9 l0 T% z! B, k7 ]cpu1 230096 2 109184 7784794 24447 0 5431 0 0 0# b  H7 S/ ~: Q
cpu2 2498253 0 80762 5566047 26575 0 3556 0 0 0
. |- j: A' m1 ^! hcpu3 2733988 0 76288 5345517 18368 0 2986 0 0 03 A6 A7 q& u' y0 m4 Y" `* [
cpu4 1268765 2 93512 6772088 32527 0 3460 0 0 0# m3 D1 G) b5 V0 g5 g% ~7 {
cpu5 577480 0 100944 7466708 19525 0 3660 0 0 0* K# ]9 J% b. |- B! B
cpu6 575574 0 99252 7464805 24467 0 2785 0 0 0
* m* ^0 S2 U& p! gcpu7 531364 9 96973 7510365 25178 0 3384 0 0 0
. X+ z( K7 J5 ], m  N2 ointr 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
" z, E& J0 @. b9 T0 w' B3 w5 Ictxt 374979507' {. S7 b7 C4 d& q  N
btime 1694791989
0 t5 X. A; I$ }! V. {processes 2234872
, n  f' n6 J8 O1 e2 K# e' dprocs_running 47 k6 H& D2 b' E( V* x1 C0 a: Z; S
procs_blocked 0
$ o/ @( }9 F* _% e9 F1 Rsoftirq 279664532 1 159117851 16412 20782044 785020 0 41986 18593620 0 80327598
( v  G! x) D3 Q# ]1 f/ m) O0 A' |' p

+ ~1 ?& @6 j9 c& E8 B# N. N! k' v  u; r" t

  H/ H" q4 B9 I( X& h就拿第一行来说:
0 D# w+ L4 s+ e" ]% D3 Q% E0 H& J3 R- v4 {5 ?7 Y. C6 l/ r2 ^
   cpu  8742195 15 754479 55626730 192455 0 32760 0 0 0- b! F0 s& D6 s# P1 N" B9 \
$ o+ k5 C$ z0 I: A
/ I' `0 g9 u1 p& u% c
第一个字段(cpu)是cpu标识。3 s& I/ B0 g8 x# l! a8 Z

2 r+ B4 I0 y; N+ V1 S第二个字段(8742195)表示是从系统启动开始一直到当前时刻,进程在用户态(user)下执行的时间积累。
4 F5 @2 m: S# X! O
. O5 F6 ]1 h8 @- N. c6 x第三个字段(15)表示是从系统启动开始一直到当前时刻,nice值为负的进程所占用的CPU时间。
$ z/ {2 i8 s4 d$ X
$ p1 Z! J% I8 k: k8 a( Z: t第四个字段(754479)表示是从系统启动开始一直到当前时刻,进程在系统内核(system)的执行时间积累。6 T0 A& [# D& p- r

& p& c* `$ G# }0 K- U% j+ U第五个字段(55626730)表示是从系统启动开始一直到当前时刻,处硬盘IO等待以外其他的空闲时间(idle)积累。
& i" x2 d6 y1 F4 \, J5 U
% G8 s0 |4 e: Z/ a第六个字段(192455)表示是从系统启动开始一直到当前时刻,IO等待(iowait)的时间积累。
" D. ~# N+ K. Z8 c! e3 Q$ b) `) e5 X9 j% ~0 u3 P: h
第七个字段(0)表示是从系统启动开始一直到当前时刻,硬中断的时间(irq)。
* c+ T( p) i# x: b+ y* e1 T2 [0 e0 z6 y. ]" N# [0 x2 q
第八个字段(32760)表示是从系统启动开始一直到当前时刻,软中断的时间(softirq)。
+ m# o2 g5 c6 y' U8 s0 K; |+ {5 [6 o
剩下的几行:
4 Z8 X& [4 l+ Y( V0 E& G
. ^2 k" v) w2 y0 Kintr: 给出的是中断信息,第一个数为自系统启动以来,发生的所有中断的次数;后面的每个数对应一个特定的中断,表示该中断自系统启动以来发生的次数。# D/ X% `$ {, K! M4 O1 T; }5 e

, A; T) e2 Y& t, mctxt: 表示系统CPU发生的上下文交换次数。9 _4 P4 a' I$ q4 B& `0 g

$ n/ b5 R1 t4 }% g5 O' M$ y; Zbtime: 表示自系统启动到现在的时间,单位为秒。
6 H. M2 v0 E; g  b. ^0 b
2 J1 M' p+ y2 z; A2 Y1 Y" i1 Sprocesses: 表示自系统启动以来所创建的任务的数目。: \9 p& Z. m9 }8 C" J

2 v/ J- I5 G# N7 G9 \procs_running: 当前运行队列的任务数目。
! x* A4 j6 o' M" d. e0 Y% h* P6 M4 n: t' y5 {8 c2 Z
procs_blocked: 当前被阻塞的任务数目,等待I/O完成次数。
2 ^9 l+ {9 i& c$ L  S- v6 |
, `3 A" w; P. X* l; h, RCPU的使用率可以通过如下方式计算:
4 E- U4 w  {5 r  P' v- N$ Y6 r+ E
cpu_usage=(idle2-idle1)/(cpu2-cpu1)*100) T, S- ~; Y# l8 c! B

; J5 O8 {& z' g9 {) jcpu_usage=[(user2+sys2+nice2)-(user1+sys1+nice1)]/(total2-total)*100
. D7 r+ y# N" }& q0 @. m) e' `6 F
获取CPU使用率的相关脚本如下:
5 r8 B3 Y' c$ `. W) d$ ^
2 Y* i1 L: j0 ^/ M6 [" z$ I( u* {  G4 D, s' h% P
登录后复制 - r. S; y& L6 c( v' F/ |
#!/bin/sh6 V' j, V5 @! s5 x( e
#
/ z1 P7 p$ h2 F) T6 L2 J#脚本功能描述:依据/proc/stat文件获取并计算CPU使用率
, w4 \# y) `* q8 q( d  c+ ~#
6 U. M( a5 C+ B+ H2 U- T#CPU时间计算公式:CPU_TIME=user+system+nice+idle+iowait+irq+softirq
8 I/ e$ `* v  [6 w! O2 i. \6 b#CPU使用率计算公式:cpu_usage=(idle2-idle1)/(cpu2-cpu1)*100
/ [  N; T& ~6 G0 ?  n9 r6 i$ o6 ?* E#默认时间间隔
0 K# c2 l  }) _2 E7 o9 PTIME_INTERVAL=5! w9 A4 t! i: z9 m
# _2 h) @$ c  j3 @" o0 `. a
LAST_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')3 c4 I' p. ?0 A' V
LAST_SYS_IDLE=$(echo $LAST_CPU_INFO | awk '{print $4}')9 g, H; s) `) s3 A9 h
LAST_TOTAL_CPU_T=$(echo $LAST_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')! \3 \( G( g" X+ [# [$ A9 _
sleep ${TIME_INTERVAL}
/ E+ \3 P7 c- U8 ]NEXT_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')
% Z% }# }5 w# n$ A" l) e0 ]) qNEXT_SYS_IDLE=$(echo $NEXT_CPU_INFO | awk '{print $4}')
/ D- U; l/ x' }. t4 VNEXT_TOTAL_CPU_T=$(echo $NEXT_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')
, w9 Q) x* B: Q! ]$ F# }' S# b! e( Q3 J) T
#系统空闲时间
+ x+ h' v8 P, {% uSYSTEM_IDLE=`echo ${NEXT_SYS_IDLE} ${LAST_SYS_IDLE} | awk '{print $1-$2}'`. _1 w7 Y8 Y/ L- k; j
#CPU总时间$ L: M5 ?6 c- a
TOTAL_TIME=`echo ${NEXT_TOTAL_CPU_T} ${LAST_TOTAL_CPU_T} | awk '{print $1-$2}'`7 u: b* {; e: I0 y1 H
CPU_USAGE=`echo ${SYSTEM_IDLE} ${TOTAL_TIME} | awk '{printf "%.2f", 100-$1/$2*100}'`
' [& p9 W" t# Z. \3 L/ F  @* m. x' }& Z+ Y! @% d4 N
echo "CPU Usage:${CPU_USAGE}%"' K% N+ C: K5 B: ]& |

4 I9 w; b+ R# I! K; ^# @, V# m1 |2 ?/ v: O+ p0 r

; \2 c7 u) r4 H4 Z7 h# J7 ]$ p
# k0 {' E- D" ?8 q[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'' C- x$ X" [- t, h4 ^) ~
14.9
4 O: e0 u7 E$ K0 W- p[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)'
  q9 W9 D. ]8 D  s" @- d( F4 d%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- ~7 `1 t$ Z* a9 U* V
[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'% Z2 q3 Z( e3 t+ k2 O9 C
27.0
# t: m) S9 ^* R& k3 `, u0 \
- h, i7 D  U4 h$ U8 n2 |, b" xfor循环脚本:
7 R, ~- V5 ?4 U; x9 s0 \for((i=1;i<=5;));  ) b; ^7 ~6 ~  ]3 b5 G9 M4 G- b' h) h( c
do   2 \% O2 |0 P; G+ R: p% B4 l' T
    cpu_us=`top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'`
% `+ m: V3 L: X    cpu_sy=`top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $5}'`
! `8 k0 t  S+ w. r; d( D# q+ H    #echo $cpu_us
) Z2 U2 f  Q& g; M4 n    #echo $cpu_sy9 m! M" F7 }. C5 j( a# f
    cpu_sum=$(echo "$cpu_us+$cpu_sy"|bc)
- K, M9 f3 ^0 D. V' a    nowdate=$(date +"%Y-%m-%d %H:%M:%S")
9 [% S+ W2 Z3 t; ?    echo "$nowdate CPU_SUM: $cpu_sum%" >> ./cpu.log* m& Y7 t: Q9 A# s- ~, r! w
    sleep 120
3 D4 E: x/ s# adone# z8 |- \; `* P! j: {
: x4 t& s0 f: k9 ]* b
. S3 x8 \8 F/ E5 O
4 |/ W6 @9 ]5 F  U) W
nohup sh cpu.sh >/dev/null  2>&1 &
6 O2 o. r9 ~, |9 [. B% a5 O4 o9 O

  }# i* _, ~7 m& i1 p, ~5 e# g* h1 g# X- O) T

' k; x* u. y; Y% ?; H, Q8 G9 z
4 L$ h& X2 U+ J
. a9 e5 t$ f. {( x+ q3 I8 w( V
" |" B2 ^+ j1 m

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:32:06 | 显示全部楼层
#!/bin/bash' N; c1 F; K' Q" P# o  c
! z' F5 n$ @! O) j8 [. ~/ x
# 获取ip
5 w8 y& O# N) s7 Y6 M: u$ m% gip=`ip addr show eth0 | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print ""$2 }'`0 t& a' _* x  G6 i( M! i. G
echo $ip4 W# Z7 p8 G& q! x" L+ A
ip_index=`echo $ip | awk -F '.' '{print $4}'`' n3 F5 n  J# J: f& b1 d6 w
& r: N; u/ a! w, T7 |
#计算cpu使用率9 u" n- j4 n7 s
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;}'`
/ f0 k1 u1 w" C/ decho $cpu
# C7 R' s8 l' M+ }$ U" F7 t% i7 N1 u. g: M0 ?; C6 E1 A* K7 n' a
#统计内存使用率- d( E$ T7 B, r
mem_used_persent=`free -m | awk -F '[ :]+' 'NR==2{printf "%d", ($2-$7)/$2*100}'`
: x9 u8 r1 g* B$ ^! Necho $mem_used_persent

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:33:40 | 显示全部楼层
top 参数、含义、思路+ Z; z9 [7 j) @* V
查了一下top的参数, -n 参数的意思是 刷新一次就停止(只输入top 是会一直在刷新的)
8 _& q" `6 I  `% `Cpu 这一行有很多个参数,每个参数都有自己的含义:
- z9 A( }/ J( D8 j3 cus 是用户空间占比
+ O5 l* n; A! ~/ j' Z9 n8 Osy 是内核态占比
* r1 u: U* G3 oid 是空闲占比* i9 R; O  B2 o& M! B; \6 ~1 v5 |) s
还有其它的都是各种场景的使用占比
& z. e# X! D3 r; E% y7 d  |% j- a( U所以我们是取出 id, 然后 100-id& L5 P7 a- F* p+ j5 [/ j7 a

0 r$ ]- u* E% p5 q! d: c

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:36:19 | 显示全部楼层
2个CPU表明系统负荷可以达到2.0,此时每个CPU都达到100%的工作量。推广开来,n个CPU的电脑,可接受的系统负荷最大为n.0。' K6 y9 G4 G; L9 u! R
2、查看服务器cpu的总核数, m) M& G7 F$ d9 m2 c# \# A- n
复制代码代码如下:
+ m' Z7 S" b2 {6 Z: `2 x' ~7 p0 s5 F, W3 s& q2 T
# grep -c 'model name' /proc/cpuinfo  或者       cat /proc/cpuinfo
8 X) B, X& H  F5 L( s8 Q: N$ g* P" K# {" j( I
3、截取服务器1分钟、5分钟、15分钟的负载情况: }/ s+ [' t0 L) B
复制代码代码如下:
# S3 t. [4 v' O/ c2 ?
3 i+ _, g; f4 D' R# uptime | awk '{print $8,$9,$10,$11,$12}'/ S- s+ l/ U& g8 l( r
   load average:  0.01,    0.02,   0.00" }0 _$ ?2 h! @1 m
4、查看截取15分钟的平均负载
6 q* o/ U$ k" [( D" G$ I4 }6 X# [2 |' O  h
复制代码代码如下:2 X( i1 g3 \& A# U7 l9 v
4 x7 x2 Y# j8 L( ]/ [( B
# uptime | awk '{print $12}' (用 '{print $12}' 这个获取的不够准确,如果都用awk取第12个字段的话,结果有可能为空了。而用$NF表输出最后一段的内容): R* U+ n4 {# k
# uptime | awk '{print $NF}'7 J! k; `3 R. S' d7 w2 r- A
1 W5 R$ ?0 D# s( }
5、编写系统负载监控的脚本文件:
; r4 v- Z% @! \( m' f5 L复制代码代码如下:
; C0 v) H& q* ]* S7 l: t$ J4 h1 x% d! f. [
# vim /scripts/load-check.sh% ^+ h$ E& U: x6 \/ n
[code]- e& ^8 T- Z, m1 a" L& f
#!/bin/bash / }; K6 @  w* g" p, L4 p% ?. ]
#使用uptime命令监控linux系统负载变化
1 z9 w+ m5 G. H5 {' d- W - Z$ Y* Y( u) K" E3 F4 j
#取系统当前时间(以追加的方式写入文件>>)
% c+ ^; Z# f4 A7 o5 P2 M5 L* [% Ddate >> /scripts/datetime-load.txt   
/ R* E" A& B% K  z) e6 v - M0 B6 C: M, F" y& u' {; Y
#提取服务器1分钟、5分钟、15分钟的负载情况
4 T3 e0 Z2 x' ~& `uptime | awk '{print $8,$9,$10,$11,$12}' >> /scripts/load.txt
1 a0 s7 S! z# d + i; D9 y6 h( W3 d( T' w+ J
#逐行连接上面的时间和负载相关行数据(每次重新写入文件>) 7 ^+ t# z& q, o! W5 ~9 }$ \
paste  /scripts/datetime-load.txt /scripts/load.txt   > /scripts/load_day.txt
0 _* Y- C9 G3 H4 Y! Y# chmod a+x /scripts/load-check.sh4 }9 o! a( ]& \2 ?: J' R+ Q2 c" N
6、编写系统负载结果文件邮件发送脚本:
5 }* s( Q0 h' K' t6 [复制代码代码如下:
, Z, I" X# W! o3 p3 F3 H% x6 C! k/ ^: X8 f5 d6 T
# vim /scripts/sendmail-load.sh7 ?0 J$ i) U3 L! j
#!/bin/bash & E- z: ?# N# f! L
#把系统负载监控生成的load_day.txt文件通过邮件发送给用户
1 ~) H! x. x* x2 P , x) ^) }5 p" P9 ~- Y8 k6 [
#提取本服务器的IP地址信息
  a  j( r# x7 v' b& v' @, FIP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
8 k5 P8 X4 u) U& `
: X; ?' g7 [8 j- [- x7 u- u#提取当前日期 8 C: D' s& t- W. Q
today=`date -d "0 day" +%Y年%m月%d日`
, X- Q1 R+ S. Y5 e3 ?! ~/ j: E
, k7 z  e: [! L4 d0 x#发送系统负载监控结果邮件 5 O2 m& w! `/ m
echo "这是$IP服务器$today的系统负载监控报告,请下载附件。" | mutt -s "$IP服务器$today的系统负载监控报告" -a /scripts/load_day.txt  fuquanjun@xxx.com1 L; P4 F9 R; S6 l: m& W4 e* X& a* Q
# chmod a+x /scripts/sendmail-load.sh% @( c+ O- q' j8 C3 ^# ]9 K9 F
7、编写系统负载监控的脚本文件:
0 k$ w8 R, S& G复制代码代码如下:9 I3 M/ z4 w7 C* H( S0 b

' B' ^" @+ l" l# {( f# vim /scripts/load-warning.sh
/ u1 g) b9 d/ \$ R- O/ a#!/bin/bash
; t; ^1 y, t. |, @$ e#使用uptime命令监控linux系统负载变化 3 g4 r( N2 T- N0 T5 @

+ B7 [9 d7 c* B7 N" A#提取本服务器的IP地址信息
8 i3 s, s. ]; `IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
( {/ o- u: a9 w; o: M: j% [. K
# u* O2 D$ i1 S  J4 C, `#抓取cpu的总核数
6 t: e, X+ g* K. ^3 e  `1 ccpu_num=`grep -c 'model name' /proc/cpuinfo`
' V) H: B6 H9 w
( {( J  i9 _9 @4 F4 g#抓取当前系统15分钟的平均负载值
& z% g# ]' F0 nload_15=`uptime | awk '{print $NF}'` % q3 _( ]8 b  R8 W6 N
0 r8 a: j! l2 u* B8 t! m2 t9 T
#计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。
, j, M, L" Q2 u5 P& ~& ]: @average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc`
" a+ {( H0 J3 c4 ~) A. A$ }
& ^' ^" M& m. G3 T1 s! \1 c* H#取上面平均负载值的个位整数 4 u* S- T. `. Q0 v
average_int=`echo $average_load | cut -f 1 -d "."`
4 D# g: P' p! C5 E$ c4 I
7 T, d% o6 R, \. f9 }#设置系统单个核心15分钟的平均负载的告警值为0.70(即使用超过70%的时候告警)。
1 q4 {& t. B% u7 \! L) \load_warn=0.70 3 g# @; z2 Y4 G
9 P6 `( g" K# B( j$ x
#当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0) ,直接发邮件告警;如果小于1.0则进行二次比较
- q5 F: l% S, Yif (($average_int > 0)); then ( J* ^/ S/ r! \+ a! X
      echo "$IP服务器15分钟的系统平均负载为$average_load,超过警戒值1.0,请立即处理!!!" | mutt -s "$IP 服务器系统负载严重告警!!!"  fuquanjun@xxx.com
3 ]; G+ h. k% q4 r, ]else
, U6 P2 M% U+ P: t#当前系统15分钟平均负载值与告警值进行比较(当大于告警值0.70时会返回1,小于时会返回0 ) 7 j$ e% \0 a' N! i5 g$ C
load_now=`expr $average_load \> $load_warn`
2 A* J0 p& L' g& _4 h! Z5 o% d& W
/ G" l: M0 Q  n#如果系统单个核心15分钟的平均负载值大于告警值0.70(返回值为1),则发邮件给管理员 1 l1 W- y& T; w- M& ^* P# f% b
if (($load_now == 1)); then 5 @; d. [1 w$ N, h( E3 y3 J7 O
    echo "$IP服务器15分钟的系统平均负载达到 $average_load,超过警戒值0.70,请及时处理。" | mutt -s "$IP 服务器系统负载告警"  fuquanjun@xxx.com   n9 T4 `% \6 o3 U4 p6 n
fi & O6 ?% m9 M4 |
fi4 m' \  N$ k6 Q5 L% Z/ _; p! u6 l9 H
# chmod a+x /scripts/load-warning.sh
/ ^2 u* n0 J6 X6 N9 d( D7 G三、监控服务器系统cpu占用情况:
) Q) Z& L: u8 i* f# v0 `4 F0 E- J3 N+ d
0 m, e( J, s. r7 p4 Q# ^7 `4 d4 z1、使用top命令查看linux系统cpu使用情况:0 @) G5 `, y/ y  i( t9 `) |  J
复制代码代码如下:
- L! F9 k% p" }& G( D+ Y0 Y! X5 N+ y4 ]4 `- A
#  top -b -n 1 | grep Cpu   (-b -n 1 表只需要1次的输出结果)! N6 \# s; n# U# W$ K
     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%st
4 J+ Q2 d2 V+ D1 G
! `$ F: O4 }3 p' o& f2、查看截取空闲cpu的百分比数值命令(只取整数部分):
5 ^: K- z# r/ |0 @1 `复制代码代码如下:
! I; x0 a8 K( f. Y9 r  z6 Y$ d  L
# top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."
4 q, Q$ u8 v. P& D
1 ~2 T# @6 I3 F% Z* K3、编写cpu监控的脚本文件:# t2 L  H: e( f) U  Y9 y
复制代码代码如下:
) B4 |3 W9 S, K2 W" N3 v  w, I1 d* d1 m  ]5 ?) T3 }
# vim /scripts/cpu-check.sh8 \$ l7 E* `3 W
#!/bin/bash
4 J4 z9 M" b3 d6 F! H$ R#使用top命令监控linux系统cpu变化 # b+ y/ r# g# f. ^. y5 X
5 g2 x5 d1 |' ?% t
#取系统当前时间(以追加的方式写入文件>>) . @$ C; {: T/ t
date >> /scripts/datetime-cpu.txt   
  h, i1 W5 `4 H9 ?# o
) E3 R9 d: H( p- D/ }#抓取当前cpu的值(以追加的方式写入文件>>)
' P; D( G1 a# o: ?( J# Etop -b -n 1 | grep Cpu  >> /scripts/cpu-now.txt  
6 G  ~( d: v& O" ]
, U2 A8 J0 z: ?6 i' a#逐行连接上面的时间和cpu相关行数据(每次重新写入文件>) / z! r! O# e% S$ w4 B
paste  /scripts/datetime-cpu.txt   /scripts/cpu-now.txt  > /scripts/cpu.txt2 k# o) r! _0 d2 c9 {/ x
# chmod a+x /scripts/cpu-check.sh7 G9 U; F8 ~; _' I6 I1 R# o4 R
4、查看CPU监控的结果文件:
) d) k; q$ p7 S: C复制代码代码如下:
5 `5 Y8 C) J8 z; K; i
+ ^/ D; N6 Y9 F6 V/ R; G# cat /scripts/cpu.txt5 ~  t0 a* ^. Y& s

  u- T/ O: h" R1 K% ~* e5、编写cpu结果文件邮件发送脚本:
0 [) h% [( K( J/ u( ^5 p复制代码代码如下:
8 @$ j0 b* [& O7 K; ~# R4 `7 \; t) C: c, _( r7 M( d: [- P1 ?
# vim /scripts/sendmail-cpu.sh& S# e/ x" t& l7 q4 U
#!/bin/bash 7 I( u0 i# Z& L, g: T% H5 y7 D
#把生成的cpu.txt文件通过邮件发送给用户 , Z$ N$ A' L" B: v
8 {! @( U  R3 g1 o
#提取本服务器的IP地址信息
; f% Z2 B& v' i+ u& t* a3 `IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` + r+ o5 e2 g' u+ G, a6 x3 A

% E- f9 Q4 c# B#提取当前日期0 q" A  [' g/ ?1 u
today=`date -d "0 day" +%Y年%m月%d日`
. ^( N# x$ @" Q. C; y2 ^4 i1 \
' j. h( S* b1 b: V" t#发送cpu监控结果邮件 ! ^/ b5 {1 S% x* o4 o/ B
echo "这是$IP服务器$today的cpu监控报告,请下载附件。" | mutt -s "$IP服务器$today的CPU监控报告" -a /scripts/cpu.txt  fuquanjun@xxx.com
+ n- t+ n0 i% i% N7 \' L" H # chmod a+x /scripts/sendmail-cpu.sh; |/ D$ \5 V6 a  u, i7 D2 |: \
/ R5 Q, e+ U7 y& y6 z3 {: x. u2 i
四、监控系统cpu的情况,当使用超过80%的时候发告警邮件:
& z4 C; p6 Y( D: i7 }% V) @6 Z; N3 c% k: \! S7 M" g
复制代码代码如下:
; ?3 u' R2 J  g- m/ z1 Z2 h( {! B( m% L! @1 O
# vim /scripts/cpu-warning.sh2 L* W3 b: t; t. X4 C9 F
#!/bin/bash . o: P- _( x$ ]( g" r, n/ M
#监控系统cpu的情况脚本程序   l  I3 `8 j& ]0 \! O, [7 P% L

1 O  f& a0 B- I# [3 M/ M2 q) z7 z#提取本服务器的IP地址信息
# O' s8 l4 p$ SIP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
3 ~4 T/ V( @0 p1 e/ P- |
5 o# O( k% [; F+ U- U* h#取当前空闲cpu百份比值(只取整数部分)
7 n+ b, w4 m8 v5 Z, l+ fcpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."`
8 n+ P+ c! k6 E - b$ ?* n. V+ Q/ V$ m* v
#设置空闲cpu的告警值为20%,如果当前cpu使用超过80%(即剩余小于20%),立即发邮件告警
9 A. P: L$ s- @$ bif (($cpu_idle < 20)); then
2 [* x% S" z& o2 [7 i      echo "$IP服务器cpu剩余$cpu_idle%,使用率已经超过80%,请及时处理。" | mutt -s "$IP 服务器CPU告警"  fuquanjun@xxx.com
/ x5 s, X) x$ {% Ufi6 j% D9 H# e# E" o1 m- ^
# 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使用率。

; A& s, X3 {7 u& w3 l
" i+ K, y: H( p#!/bin/bash  N/ S9 ]/ z8 L# y* X0 X7 i% d1 j

( S0 X8 f3 W" U3 L) S- i+ w& qoutput=$(timeout 60.1 pidstat 60 -p ALL)
( l" D. R1 v4 i. y( L- Q- s3 p& P9 b9 p+ v9 c! V( F. ]
IFS='
2 y0 @8 I" b! s% y; C( Q( A/ E" w5 M4 n) \& Q
'
+ h% b  B5 t0 y& w
- ?, Q8 I& u5 u4 \6 p# e$ j- cfor line in $output; do
0 ?' {& J7 \* h  K7 v, `
7 D0 b! P% M* V; Y/ E8 w$ O/ m: N    # extract N-th column with awk# n0 S+ i0 X$ V) a, I

, C/ Z) ~, F' P+ M, u5 D    pid=`echo $line | awk '{ print $4}'`    # PID
9 V! g; d! d# z3 C, A6 @" e2 I# Q7 E  ^
    pcpu=`echo $line | awk '{ print $9}'`   # percentage CPU1 N8 d# D) J. u% ]' R, Z5 ?

. V3 a: f0 j3 c4 m    cpu=`echo $line | awk '{ print $10}'`   # CPU ID
$ T$ N$ u4 i. l: g0 L% }8 @6 d% c9 [0 `. o! F" N
    cmd=`echo $line | awk '{ print $11}'`   # command+ F0 a9 ^8 f" p
- W) t, x. k8 i5 B( v
    echo "$pid $pcpu $cpu $cmd"
2 T; c" p/ M$ }7 ^6 T0 G: B4 k, i& w& R1 }& U1 t, p% ~  B1 J
done

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:42:49 | 显示全部楼层
$ top -bn1 | grep load | awk '{printf "%.2f%%\t\t\n", $(NF-2)}'
  C  d8 l; K6 q- A5 T1.30%                5 F' t/ [! {! T/ i
0.10%                " S! ?0 l; \4 f
0.00%               
) _, c/ ?# p8 I/ ^' e; f' r) ?" S3 g7 _- k9 B+ D# |. |
$ top -bn1 | grep load
6 b: V, N+ ?/ h2 Q( Ytop - 22:41:46 up 23:08,  2 users,  load average: 1.30, 1.28, 1.34& V' m& u# p' }/ {( M
  2089 root      20   0  385436  14672   9064 S   0.0  0.1   0:05.97 lloader
) \, N& I, b9 i' Y  2090 root      20   0   81668   3904   2936 S   0.0  0.0   0:01.08 lloader& ^1 P& P5 i. e. q: H) a$ c* _

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-11-10 16:26:47 | 显示全部楼层
# vim /scripts/load-warning.sh
( E5 y% ]8 F/ d4 y! D3 p. T#!/bin/bash
  t% N* f# U4 C- R#使用uptime命令监控linux系统负载变化 9 {1 b8 d4 ~% N" M" }  i+ Z& x7 Z
5 f. M% Y6 l4 e& N# {8 q
#提取本服务器的IP地址信息 - G0 \- V* z/ Z6 z: o
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` # w, {' J4 V; c5 [

" _" U2 z6 M/ l' G$ e$ T8 a# {#抓取cpu的总核数
9 G6 ?* @1 R$ o: [cpu_num=`grep -c 'model name' /proc/cpuinfo`
5 L+ P% M: h* E5 s1 i
% _& b  R2 u) s) p" j& I3 X. l1 L#抓取当前系统15分钟的平均负载值
  K) p& {+ q0 f  f5 ~1 A. wload_15=`uptime | awk '{print $NF}'`
' y4 E6 P) u+ s( j0 G; b% E2 m, }
#计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。
% }- k+ o/ C6 i4 e! kaverage_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc` ( A* k; J! E# t  q

- Y1 L( S; k7 ?, ]#取上面平均负载值的个位整数
1 ^2 e: ~; p# p4 d. Javerage_int=`echo $average_load | cut -f 1 -d "."` ) ~  k. O( ]1 N
8 f: l  v5 ^/ z' V) Z0 A+ W
#设置系统单个核心15分钟的平均负载的告警值为0.70(即使用超过70%的时候告警)。
, i# S. I- w4 V- R) V/ fload_warn=0.70 " t- W8 }& p" X/ Y6 b/ a& z& @
6 ?4 j" j4 J+ R* g$ y/ L$ \& ?
#当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0) ,直接发邮件告警;如果小于1.0则进行二次比较 0 ?! ]& ]  U8 K5 T2 l5 A5 O
if (($average_int > 0)); then
. B) E3 I# ?+ g1 Z$ A/ c  echo "$IP服务器15分钟的系统平均负载为$average_load,超过警戒值1.0,请立即处理!!!" | mutt -s "$IP 服务器系统负载严重告警!!!" fuquanjun@xxx.com * P8 s! d" `/ a$ w9 I% b2 o% f
  else " x# I' L+ T/ x: m3 O) ^2 r* Z
#当前系统15分钟平均负载值与告警值进行比较(当大于告警值0.70时会返回1,小于时会返回0 ) 0 r, }9 `- C3 `! F( J
load_now=`expr $average_load \> $load_warn` $ j8 `3 s, d% P4 J
( N5 m- E3 Y5 _7 W
#如果系统单个核心15分钟的平均负载值大于告警值0.70(返回值为1),则发邮件给管理员 2 _" ?# w0 U/ a2 E  Y+ `8 C
  if (($load_now == 1)); then
' [( g' Q, h2 w+ V    echo "$IP服务器15分钟的系统平均负载达到 $average_load,超过警戒值0.70,请及时处理。" | mutt -s "$IP 服务器系统负载告警" fuquanjun@xxx.com
# l3 z' `4 ^  Z" {, }' p  fi
2 N. ?% A. a8 W* C, Z- rfi
. _# b/ B, _% \4 [; O$ j# chmod a+x /scripts/load-warning.sh
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 03:05 , Processed in 0.025589 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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