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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2023-9-16 22:28:49 | 显示全部楼层 |阅读模式
在Linux系统中可以通过/proc/stat文件来计算CPU的使用率。其中各项参数说明:
/ l3 B  X- {9 y: |# n* U7 K& Y1 s6 A4 I! A8 Y+ G2 P; i: e
cat /proc/stat
, {: C* f/ N5 ?) tcpu  8742195 15 754479 55626730 192455 0 32760 0 0 0% u- J* W$ L7 e8 E2 }* |8 S+ `, i% ^
cpu0 326672 0 97560 7716403 21364 0 7494 0 0 0! R/ [  e9 @+ k4 l# _6 n, e
cpu1 230096 2 109184 7784794 24447 0 5431 0 0 0
) N0 a8 m( R- o, L9 @cpu2 2498253 0 80762 5566047 26575 0 3556 0 0 0( ]" f# Q# {. o" U
cpu3 2733988 0 76288 5345517 18368 0 2986 0 0 0* D+ }+ T' G7 g, I2 U/ {9 C
cpu4 1268765 2 93512 6772088 32527 0 3460 0 0 0+ Q% I0 r( _8 _8 X. i9 h4 C1 W
cpu5 577480 0 100944 7466708 19525 0 3660 0 0 0% d# j* F: ?) I: e3 k3 M1 M! d
cpu6 575574 0 99252 7464805 24467 0 2785 0 0 0
) W6 Q. ]9 T6 T; f% Lcpu7 531364 9 96973 7510365 25178 0 3384 0 0 0' S! a" O* L0 }7 x8 c3 ]
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 08 V, e% Q1 m' W* L% ~
ctxt 374979507
* O; m7 ]% W2 M! p; Y9 ]# f7 wbtime 1694791989; g6 C6 c- R# }) [, j5 {" P1 j; F
processes 2234872
8 A- g) L& A* D. C' {0 jprocs_running 4: j' k0 {. ?; k( R
procs_blocked 0
2 D( i9 A2 _4 t3 Qsoftirq 279664532 1 159117851 16412 20782044 785020 0 41986 18593620 0 80327598
" F% u* v0 G  F( Q& B1 p8 p2 E
$ t7 |2 I2 ~+ K! D. k( `2 U: g! \* l6 T1 J2 Y- J
- c' }! L7 I6 O2 C/ g0 C9 c

2 N1 g% U* T, g1 `( d  n就拿第一行来说:; b/ W) ?& Q5 u7 z0 J2 c
/ K3 S2 D! C" f" l
   cpu  8742195 15 754479 55626730 192455 0 32760 0 0 0- \" j4 p8 o( j) ^

6 X" v) C1 B+ Q. i) N- E) f, g) ^- G/ W
第一个字段(cpu)是cpu标识。% d6 h2 X1 x3 h5 g6 P/ @

  [3 E4 c- }# k第二个字段(8742195)表示是从系统启动开始一直到当前时刻,进程在用户态(user)下执行的时间积累。
; Y4 A! Q# d8 u
! \" k- g0 W, o9 U) ?, S" V第三个字段(15)表示是从系统启动开始一直到当前时刻,nice值为负的进程所占用的CPU时间。0 Y& V) q, Y2 W- G
; v! g. J% q, L
第四个字段(754479)表示是从系统启动开始一直到当前时刻,进程在系统内核(system)的执行时间积累。
  u2 E" ~- L' s, N$ ^) Q2 w$ L% w  D9 f$ p
第五个字段(55626730)表示是从系统启动开始一直到当前时刻,处硬盘IO等待以外其他的空闲时间(idle)积累。
/ J8 E  y, J9 ]0 X8 T& k% {, l1 D4 J  C- ?6 ]! x; U. @; t
第六个字段(192455)表示是从系统启动开始一直到当前时刻,IO等待(iowait)的时间积累。
8 z0 [# o* {. E, M& a
: |! O, G4 W9 K0 o2 a第七个字段(0)表示是从系统启动开始一直到当前时刻,硬中断的时间(irq)。
3 o" K2 x8 y, |) @. b2 h
- [3 E3 t: ]! o第八个字段(32760)表示是从系统启动开始一直到当前时刻,软中断的时间(softirq)。
2 U3 ^3 @) }  k8 h0 T; L' }' J) Z+ n7 q9 F8 @" V% [
剩下的几行:' i+ [0 @# J) J6 D5 M

5 n# E8 \% a8 `9 u  Pintr: 给出的是中断信息,第一个数为自系统启动以来,发生的所有中断的次数;后面的每个数对应一个特定的中断,表示该中断自系统启动以来发生的次数。
9 P7 ?( y' l" U+ T/ f5 }5 k( Y% s3 w
ctxt: 表示系统CPU发生的上下文交换次数。
! o% p+ L7 X" o. Z& A; s
! K8 b. J( o: `! d, g: @btime: 表示自系统启动到现在的时间,单位为秒。$ [8 ]/ e) M$ T! f; ^
. z1 C9 \- @) k& |  R# Z
processes: 表示自系统启动以来所创建的任务的数目。: H4 h. u+ N* @

1 w4 ?8 n- _$ z$ s  ?0 D5 {procs_running: 当前运行队列的任务数目。
( X( v1 Q  p, I6 f5 d; q, f, e3 R. b( p4 }/ n
procs_blocked: 当前被阻塞的任务数目,等待I/O完成次数。
! B# R: f' J/ H3 f1 U# G
+ z# `' W. w# h! s' ^3 ?# gCPU的使用率可以通过如下方式计算:
0 M$ Z' [+ _6 J
5 s* I+ U; `) c" scpu_usage=(idle2-idle1)/(cpu2-cpu1)*100
& Q/ s1 k0 Q$ b7 D; T
: Y# C: L3 G8 y5 j- P$ S+ X) T$ scpu_usage=[(user2+sys2+nice2)-(user1+sys1+nice1)]/(total2-total)*100# b' [( s; ^: G" @
& ]5 T* ^$ k: i4 s  [
获取CPU使用率的相关脚本如下:: j: k) S5 [' _

, g, L" _! J' d3 o4 W
# S+ L( z! L3 k" N5 T; M6 ]3 @  o登录后复制 4 D  }5 M$ L+ {8 S  R6 _$ L; j! |
#!/bin/sh
/ A! Y6 V; T* ?9 i2 \#$ g. \! G8 l$ Z6 I: z% |
#脚本功能描述:依据/proc/stat文件获取并计算CPU使用率
+ w* N1 i4 F& t4 v#
! C; z4 k5 G$ J2 X- [7 F4 E( a, ?# p#CPU时间计算公式:CPU_TIME=user+system+nice+idle+iowait+irq+softirq
0 H; l7 v% T: t6 c7 Y#CPU使用率计算公式:cpu_usage=(idle2-idle1)/(cpu2-cpu1)*100
# ~. J: F, {" n& d#默认时间间隔: s4 D3 U6 o# C0 Q0 ?, T
TIME_INTERVAL=5
& e. W, A! l- Q; J* h( P$ P0 v# y/ W
9 J% C* _( f1 H2 K5 L+ ~LAST_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}'): ^9 g) N: j3 M4 t6 l
LAST_SYS_IDLE=$(echo $LAST_CPU_INFO | awk '{print $4}')
# I( [  e5 s% `% T2 O6 m/ H1 f/ ^LAST_TOTAL_CPU_T=$(echo $LAST_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')$ {$ J' w$ J, t& p  r6 Q. O
sleep ${TIME_INTERVAL}
( a8 j1 g8 P( T5 [  l- D+ ~NEXT_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')
1 ]( t- P. i# U* D! P0 l2 H- [" CNEXT_SYS_IDLE=$(echo $NEXT_CPU_INFO | awk '{print $4}')6 n3 |3 r3 D! T
NEXT_TOTAL_CPU_T=$(echo $NEXT_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')# F% P5 ^$ V- n& {+ W- m

* J5 [/ x% p, X' z- R#系统空闲时间7 T& F1 U# i! s! T$ V
SYSTEM_IDLE=`echo ${NEXT_SYS_IDLE} ${LAST_SYS_IDLE} | awk '{print $1-$2}'`5 o- K; p$ \: a' U) J3 U* |
#CPU总时间
6 D, ]8 C# P# A) S, U) @' WTOTAL_TIME=`echo ${NEXT_TOTAL_CPU_T} ${LAST_TOTAL_CPU_T} | awk '{print $1-$2}'`
7 g/ ^; \% c8 b. `# yCPU_USAGE=`echo ${SYSTEM_IDLE} ${TOTAL_TIME} | awk '{printf "%.2f", 100-$1/$2*100}'`
! k8 f' @( v, o3 l+ n
3 h* _' H" g1 I4 F, recho "CPU Usage:${CPU_USAGE}%"0 d8 t" a* {1 h. Y' ~: b
# O0 `, J8 C- V5 t) }: z# c; Q4 d+ A
- {0 `* F9 v& ~3 a8 j

: z; d9 n; c1 o' h" y9 d
1 B5 o4 D( l5 t: s; E# R/ H! V7 [[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'' \: w$ p7 J6 q- Q0 }( b
14.9/ J5 a5 y- d& y% _' ^
[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)'6 F5 i7 G& b" i& o5 m/ K" b
%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 st9 B7 t: D7 x2 A, M/ C3 f
[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'
( `( `# u- l' L- P+ w27.0
6 b' i; ^) L+ D; I
" Z  v( E& f& R( ^  ^( v9 B' Afor循环脚本:
% H( T- w' h& p; Q" Y7 B, Qfor((i=1;i<=5;));  
* ^: ?7 F) c, d1 bdo   
+ H7 @5 F3 m$ I( G' Z$ V" w    cpu_us=`top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'`
& S; r$ |7 K) W8 _! m    cpu_sy=`top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $5}'`, c* X+ Q3 \  x( W& C" O/ K% a
    #echo $cpu_us
( X7 @. U- \1 W7 z! [    #echo $cpu_sy
6 B& c$ l  o/ a% B8 K    cpu_sum=$(echo "$cpu_us+$cpu_sy"|bc)
. g8 \3 i4 |: G7 Q3 c, Z0 ^    nowdate=$(date +"%Y-%m-%d %H:%M:%S")
6 e. X% A! m; i    echo "$nowdate CPU_SUM: $cpu_sum%" >> ./cpu.log4 W; H/ c8 X6 v& T% m0 C" ]: E- W
    sleep 120
( w- ^/ s& @: z+ l4 ^4 e, ydone' S$ Z- a2 R  o2 J  k( D* I

' K# b% R7 k6 F# N1 O
0 }  c# T1 D: S1 J
. @+ [9 c# {# f4 K! }7 L. Hnohup sh cpu.sh >/dev/null  2>&1 &* P' M5 |% B: x' `; X& C. J5 x+ h

$ Z. u9 ^; k4 ^1 n9 [% \. S( W; A& Y
/ {. [  {- O% b0 h

6 B; e& e) k4 e) |8 C

# S2 h4 q( t! Q5 c; u) s" D. R. \+ K, L5 e1 M+ o0 V

; }! j5 l% P7 o: T: }4 ?& K  I) M: C7 b" E" c

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:32:06 | 显示全部楼层
#!/bin/bash
+ F9 F  G2 @( c5 ^, \4 K% @& c
3 {5 \% ]2 d7 X1 d# 获取ip# n5 q! T4 k$ g; J' o3 w* S
ip=`ip addr show eth0 | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print ""$2 }'`9 p6 G1 t' Y2 G+ V6 @' Q
echo $ip4 L9 ?; ]1 [6 ?7 J
ip_index=`echo $ip | awk -F '.' '{print $4}'`) p' ]+ F# @+ J( ~4 x

( H) c/ v$ z/ Z" `#计算cpu使用率
/ Z" ~8 T) A4 acpu=`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;}'`$ g+ a; G/ f5 I9 F4 \* D- r3 b! _. v
echo $cpu* X! x* a: O0 z0 e* V! b3 w, t

5 v# b$ f. g5 x1 @  j. s#统计内存使用率5 N* I+ g. j) F  {: L+ o3 T- c
mem_used_persent=`free -m | awk -F '[ :]+' 'NR==2{printf "%d", ($2-$7)/$2*100}'`
! y1 L) D& N- v, _; becho $mem_used_persent

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:33:40 | 显示全部楼层
top 参数、含义、思路
2 }, c7 l4 E1 X/ k查了一下top的参数, -n 参数的意思是 刷新一次就停止(只输入top 是会一直在刷新的)8 P) u0 U: M' Z% E7 g
Cpu 这一行有很多个参数,每个参数都有自己的含义:% z( [% {$ K" _' v" w1 r1 m" L
us 是用户空间占比
/ M7 I% g& `+ k. M% _, |1 M- Vsy 是内核态占比
7 N7 _7 F' ]9 m& qid 是空闲占比  O9 J/ ^1 W# O, y% j
还有其它的都是各种场景的使用占比) Z7 C, Z0 ?/ P/ l# C! ]& Z
所以我们是取出 id, 然后 100-id; W- `, a! G8 l/ b0 J- {0 l

' a2 r2 N' Y( s' W$ v$ V

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:36:19 | 显示全部楼层
2个CPU表明系统负荷可以达到2.0,此时每个CPU都达到100%的工作量。推广开来,n个CPU的电脑,可接受的系统负荷最大为n.0。
7 J% Q( w" d& I# g4 k0 E( }7 [2、查看服务器cpu的总核数
8 G: Q3 A, u: s$ d) E  w复制代码代码如下:
/ K1 w* l6 E1 Y! P0 M) X0 D* s+ X# {. Q+ {4 g+ F
# grep -c 'model name' /proc/cpuinfo  或者       cat /proc/cpuinfo
, }) N% G+ ]  [# z+ A( ^, r- K; s$ F% L* u5 C
3、截取服务器1分钟、5分钟、15分钟的负载情况1 Q: E( m# z6 ]  ~7 R
复制代码代码如下:
' N; M- T/ U$ N& W9 o  O. k' e2 Y& K; I& R+ U9 d( k
# uptime | awk '{print $8,$9,$10,$11,$12}'
0 k* z/ j+ @* B5 ^   load average:  0.01,    0.02,   0.00) Q; j- s) ^' C6 c1 f4 I
4、查看截取15分钟的平均负载3 M: \1 V7 _6 V# l" i2 ?
! ^) q5 u. K& w0 ^! _- [5 S6 O
复制代码代码如下:+ Z9 ?) _7 n! G" L
: |5 X! Q) C7 h* E& P! K
# uptime | awk '{print $12}' (用 '{print $12}' 这个获取的不够准确,如果都用awk取第12个字段的话,结果有可能为空了。而用$NF表输出最后一段的内容)
$ G2 g' j, |) \+ h1 U9 a& C# N5 [# uptime | awk '{print $NF}'+ n' c0 \, n3 _" Q0 d7 Y& n
0 H* ]9 f0 S! j! N
5、编写系统负载监控的脚本文件:
! ~1 [  U  r6 c复制代码代码如下:* P) U2 p. ~) E3 I4 `  L

3 D+ I, G  r' n* H) B# vim /scripts/load-check.sh. h0 S; H1 _2 \4 ^- x
[code]
: V7 g* q( v. F7 X9 }9 P#!/bin/bash ' ?" R0 v! g" [6 s, N* `/ M6 v
#使用uptime命令监控linux系统负载变化 - T1 f: M8 @/ c) G$ s( D% Y
/ F+ B2 K. U2 I* C; i% h
#取系统当前时间(以追加的方式写入文件>>) ' w1 D) D# ?# {
date >> /scripts/datetime-load.txt    / {+ q9 D4 {( B. T: I# E
! I' g5 w4 _4 n$ }9 F
#提取服务器1分钟、5分钟、15分钟的负载情况 % i: `. Y: d0 ]9 ~/ [2 N
uptime | awk '{print $8,$9,$10,$11,$12}' >> /scripts/load.txt : T. }/ i; k$ G$ I

; X" \7 O1 l7 b! U, K#逐行连接上面的时间和负载相关行数据(每次重新写入文件>) 8 O) ~) p' [, O( i' V' O
paste  /scripts/datetime-load.txt /scripts/load.txt   > /scripts/load_day.txt
( k9 p2 k( E1 h5 r. v# chmod a+x /scripts/load-check.sh
# [; }/ G+ m6 @5 W( m6、编写系统负载结果文件邮件发送脚本:1 {) Y2 G2 e8 p% N3 {* R7 q
复制代码代码如下:
% Q* b5 f9 \: D# ?$ N% A; }
3 h% n7 K* ~# d- g% _# vim /scripts/sendmail-load.sh% R; y: z5 A. B! ^$ ?+ J3 K% ~
#!/bin/bash 8 V7 a2 S- a2 K  U
#把系统负载监控生成的load_day.txt文件通过邮件发送给用户 ; j# I" R6 r6 a2 t
$ |# t; o# C+ s4 V. A, b
#提取本服务器的IP地址信息 3 g/ Z' G, @# h; @& u* |9 S
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
1 G1 Y! E0 y/ X( ^2 V , v- l; E0 [# \* a% T
#提取当前日期
+ L- I3 V0 z/ _# f1 qtoday=`date -d "0 day" +%Y年%m月%d日`
1 y: q1 |" _: ]" {* a- H" ^* h6 H- r9 c: O ( ]& K+ M5 U. o: r# p
#发送系统负载监控结果邮件 , u( O) M; W5 K  R; e: x. G
echo "这是$IP服务器$today的系统负载监控报告,请下载附件。" | mutt -s "$IP服务器$today的系统负载监控报告" -a /scripts/load_day.txt  fuquanjun@xxx.com
, t2 Q( X& V7 ?+ f8 S5 m# chmod a+x /scripts/sendmail-load.sh
6 U! F/ q" B4 t3 G* p$ P7、编写系统负载监控的脚本文件:7 J$ B0 u5 A. A( @9 x, C- |1 ^1 @
复制代码代码如下:: ]  u0 S( I9 G) X: d; s; q

' Z4 b) n+ U: L: P7 [# vim /scripts/load-warning.sh, q& d6 p. l$ V/ a
#!/bin/bash ) I+ b! \+ C6 x
#使用uptime命令监控linux系统负载变化 ; b% B4 p& a# K2 t! i! k* m

: U2 s! h0 ~+ V#提取本服务器的IP地址信息
2 @( t' u0 B- Y1 Y; t( ^. O  gIP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` # G) N) D$ D# _* p+ ?

2 {- a# ?6 V+ _$ J# U8 h#抓取cpu的总核数
6 B, \+ F6 |; e, p0 `9 vcpu_num=`grep -c 'model name' /proc/cpuinfo` " ~( m- J5 ]" u) M5 q  y3 {6 C

8 c$ s* ~4 x. r2 g4 T& N) V% n' D#抓取当前系统15分钟的平均负载值
8 x3 o6 |# ~! v5 p& M9 u0 b" x  lload_15=`uptime | awk '{print $NF}'`
" {- @( G7 X* e" V4 u' k2 F
) @4 v- k( Q* D- p#计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。
1 \% ~; m2 x5 Y, _4 laverage_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc` , D7 l. ~8 l  R1 k" m

5 l$ \" \3 g3 [- B#取上面平均负载值的个位整数 : Z# J1 ^/ z. C2 a. h" V  K
average_int=`echo $average_load | cut -f 1 -d "."` 5 H0 e' p  c5 g! p( A. b9 ^1 ?# N
9 j$ q0 u: e! ?" P6 \
#设置系统单个核心15分钟的平均负载的告警值为0.70(即使用超过70%的时候告警)。
+ T9 Y$ X. \' m) Z( dload_warn=0.70 ( h: e8 [5 f: k( p* H
0 ?6 O7 O) H+ I) x  s+ m9 M
#当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0) ,直接发邮件告警;如果小于1.0则进行二次比较
8 l) }* U7 r$ R4 A7 ~1 Pif (($average_int > 0)); then
: @$ k: H- V! [, l# G      echo "$IP服务器15分钟的系统平均负载为$average_load,超过警戒值1.0,请立即处理!!!" | mutt -s "$IP 服务器系统负载严重告警!!!"  fuquanjun@xxx.com
2 |' T0 m2 [& t" e7 \1 j  Xelse
2 b7 u5 C" R% Y#当前系统15分钟平均负载值与告警值进行比较(当大于告警值0.70时会返回1,小于时会返回0 ) : y6 {, S1 Q9 ~" H0 d( V7 q9 H& L
load_now=`expr $average_load \> $load_warn` ) I; A# |- `1 a' y! x
. Y' A% l% p' e2 M0 |' }
#如果系统单个核心15分钟的平均负载值大于告警值0.70(返回值为1),则发邮件给管理员
" m0 t' U4 J) E2 ~% k, r if (($load_now == 1)); then
9 F+ B6 h. `3 F' ?    echo "$IP服务器15分钟的系统平均负载达到 $average_load,超过警戒值0.70,请及时处理。" | mutt -s "$IP 服务器系统负载告警"  fuquanjun@xxx.com * {+ o  H: C( u
fi / f5 @$ v" _8 \9 h, O  w. L4 e
fi% E: m# W. p* Y7 k1 h
# chmod a+x /scripts/load-warning.sh
/ o8 H  @% N. O7 P$ F$ ]6 h- X三、监控服务器系统cpu占用情况:
# y( q# s6 l) O+ w. ^
# t5 }8 G, \% g) |( S% G1、使用top命令查看linux系统cpu使用情况:+ n- r- Z2 b* j3 Z4 ?4 Q, ~9 W
复制代码代码如下:
6 y) U) b( Y6 x" c) U2 H7 {7 q5 H- h' q. l, D0 A
#  top -b -n 1 | grep Cpu   (-b -n 1 表只需要1次的输出结果)# @4 R' s; q" |$ X: ]
     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  C+ E2 ^7 Y( k  V

0 l6 k$ n3 H; @& ^, i2、查看截取空闲cpu的百分比数值命令(只取整数部分):3 B; z& Y6 W; V/ P
复制代码代码如下:
: d- T7 J/ O" o/ g9 R* M& x' d4 e" B, M* q. n6 q8 {+ V2 ~
# top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."
$ v$ y7 _$ l$ r; f2 q; y: A0 u$ u$ [+ y/ _6 t* }# l0 b# f
3、编写cpu监控的脚本文件:
9 N( ~8 `; {, S, f6 J复制代码代码如下:
% X" v' F5 b. G5 i1 ^3 v$ Y5 b, ~( K) ?  Y" t6 h$ s
# vim /scripts/cpu-check.sh4 H# O, H% U: ?& }) x' v& \0 k  c
#!/bin/bash
/ \$ C2 ]' ?3 ~: G& {% V( {#使用top命令监控linux系统cpu变化
5 j8 [. e+ O' ] # X( a7 |, ^. `6 A8 Y, _
#取系统当前时间(以追加的方式写入文件>>)
. k5 z* u0 V$ W% |' O2 edate >> /scripts/datetime-cpu.txt   
; S& {! c' v: S + i2 \- b! T4 m+ W4 T
#抓取当前cpu的值(以追加的方式写入文件>>)
2 O3 H' H& I6 g- U, Dtop -b -n 1 | grep Cpu  >> /scripts/cpu-now.txt  4 e4 n) N& J+ j9 m: E3 C( ~8 b

/ R2 u, e0 {6 d2 H8 s! K#逐行连接上面的时间和cpu相关行数据(每次重新写入文件>) - l2 e# }- Z' N" K* t3 }, ]
paste  /scripts/datetime-cpu.txt   /scripts/cpu-now.txt  > /scripts/cpu.txt# z9 C' u5 i9 o- Y& x8 n
# chmod a+x /scripts/cpu-check.sh+ \3 m( Z0 w7 T" |
4、查看CPU监控的结果文件:) V* S' v3 o( r. S
复制代码代码如下:
2 a6 X( i# ~' F% m& P0 C
7 F( m6 @; t" g, F# cat /scripts/cpu.txt
. ~' D7 T4 v0 f$ X. S. t
' L" ]0 Z" g* w5 p% b7 W2 i5、编写cpu结果文件邮件发送脚本:) {! ^5 D+ p/ J
复制代码代码如下:" l$ v# U% D; l) W. S( V( ]7 k

) O% F' t) X& G/ ^# vim /scripts/sendmail-cpu.sh9 i) X: ^3 ~( F6 ~) s; m
#!/bin/bash
2 Z- g: m- @% s% i2 J#把生成的cpu.txt文件通过邮件发送给用户
% l; B& h1 W1 }: c4 `8 V! T4 g4 Y . W3 l: b" W5 q' t% v$ f
#提取本服务器的IP地址信息 / E' D4 ?" v0 m3 l8 B5 {" x
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` 2 I1 n  Q; p% a

' s/ i1 {( e$ l, `* x' Y3 W. K#提取当前日期2 n, i7 H" C. A
today=`date -d "0 day" +%Y年%m月%d日`
3 l+ s# s0 v1 w+ m% X; L# D  i) K
! o$ p: H0 \+ z2 H- H# u: q#发送cpu监控结果邮件
7 w8 @0 t2 S% ]0 U$ ^6 C8 e. jecho "这是$IP服务器$today的cpu监控报告,请下载附件。" | mutt -s "$IP服务器$today的CPU监控报告" -a /scripts/cpu.txt  fuquanjun@xxx.com: G4 s& w1 Q) q; ~$ X2 S/ i, `  E
# chmod a+x /scripts/sendmail-cpu.sh1 v# Q+ W/ }0 x0 t
& b2 T- ~! f( I% E3 o9 i. X% d
四、监控系统cpu的情况,当使用超过80%的时候发告警邮件:% ]7 S' A3 {  q7 ?  w8 _
6 ~0 Q/ Y7 T/ W7 _6 g- O' R* V
复制代码代码如下:
8 z3 O1 V+ ]. b' O4 e( [1 U  X4 w
4 \0 L; T4 x/ i, d! Y# M( h# vim /scripts/cpu-warning.sh
# G4 m7 N; Q/ q  O  T0 g( [#!/bin/bash
# v1 r& ]2 K' h. _* D#监控系统cpu的情况脚本程序 6 N+ N9 {& j! U& \8 x

6 V7 W# E' \2 |#提取本服务器的IP地址信息 . }* Z& d0 z; b% C0 b) q! n% k: `
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` + R" C4 K* K: Y: r: q1 c+ U. n
. ]8 t& Z5 T1 P- ]+ o& s
#取当前空闲cpu百份比值(只取整数部分) # D6 ?1 j/ `3 X( s1 ?  w
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."` 7 B2 d4 i2 G2 I$ G
  [' p* T! ^0 i7 H
#设置空闲cpu的告警值为20%,如果当前cpu使用超过80%(即剩余小于20%),立即发邮件告警
. w7 W/ e, s6 v0 J+ `% {if (($cpu_idle < 20)); then
+ g* M& G! ]6 {0 w! N6 E* R% \' J      echo "$IP服务器cpu剩余$cpu_idle%,使用率已经超过80%,请及时处理。" | mutt -s "$IP 服务器CPU告警"  fuquanjun@xxx.com
* R+ [( K1 P' v  Kfi
3 m2 x9 p9 i& J( {6 }4 [( a' }  b/ t# 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 T6 C& Q  T: R- J+ [. M/ N- E- ^) u7 ~+ m
#!/bin/bash
  D* O! x. q8 u  ~) @4 g' I) m0 |- ~1 |. \5 o7 W/ H
output=$(timeout 60.1 pidstat 60 -p ALL)
- F/ [! z5 l6 y3 z7 i1 v1 a8 e) b0 d' r
IFS='
. A' S) ^1 w8 k5 b6 ^! x9 D6 W( z7 Q: z& R2 ~4 l
'
* \4 L3 o0 [; O- _5 A. g# s8 a, @! t- K: ~6 g6 C
for line in $output; do
9 J2 K8 g- U0 G/ ^" O+ H4 }, G8 P1 ?" H! v1 `# K
    # extract N-th column with awk
+ [$ P) K) w( {+ Z# j) [- N+ V' ]( t4 C% E1 L$ C
    pid=`echo $line | awk '{ print $4}'`    # PID/ {- [  y! k0 j% q; p7 q5 U' G

2 ?$ n3 ~7 {8 b' }$ ?    pcpu=`echo $line | awk '{ print $9}'`   # percentage CPU
2 F8 I/ o- M. J5 G" O. `# y
  l# F5 w' D  N: B6 a6 x5 Z8 U    cpu=`echo $line | awk '{ print $10}'`   # CPU ID, ^# X9 b/ j1 Q& O
' t) X6 u4 ^& U# T8 J& z! i
    cmd=`echo $line | awk '{ print $11}'`   # command4 `9 ^/ [8 y1 r4 Q0 @. H+ Q( d

" z" z& X. G6 ~$ f' `    echo "$pid $pcpu $cpu $cmd"6 k  i/ j5 S# X1 S0 I
9 R5 Q) n' V. H7 L; J+ X
done

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:42:49 | 显示全部楼层
$ top -bn1 | grep load | awk '{printf "%.2f%%\t\t\n", $(NF-2)}'& M& c; s& k9 y! H; }5 U) ^
1.30%               
" E( P4 Z: Y" G0.10%               
# ], `, T  N% S* {0.00%                % d1 R: v6 D4 j. s
% \7 q8 S0 I) x
$ top -bn1 | grep load
' x3 V# V+ l' t0 T2 F* Atop - 22:41:46 up 23:08,  2 users,  load average: 1.30, 1.28, 1.342 ~$ i6 _% X9 f6 _7 e) |1 n. A
  2089 root      20   0  385436  14672   9064 S   0.0  0.1   0:05.97 lloader4 a0 X/ n& s; m1 J1 L  I# T8 T
  2090 root      20   0   81668   3904   2936 S   0.0  0.0   0:01.08 lloader4 O) p$ y& S3 J6 t8 e1 k6 h8 t) N

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-11-10 16:26:47 | 显示全部楼层
# vim /scripts/load-warning.sh9 e- }2 [. I( V# D/ P( z% m
#!/bin/bash " e4 E" Z) B6 t* x
#使用uptime命令监控linux系统负载变化
* t; m' }( g- h- n" |- y
$ g* q+ ?. H5 h' k  y( R1 V#提取本服务器的IP地址信息 ' D) E+ R5 L: q. J$ d
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
: ~2 ^7 p; K9 O6 q% w0 n* H$ E9 ]# I8 ]* K% f% D, G
#抓取cpu的总核数 ( B9 i  A' ], K# }+ b
cpu_num=`grep -c 'model name' /proc/cpuinfo` - x) G" i' l* ^) R

  _3 Y6 y8 a/ |#抓取当前系统15分钟的平均负载值 6 ^- [2 S7 A* S3 w) v; u8 W
load_15=`uptime | awk '{print $NF}'` " U% b) O  u3 f  ~/ J& v
+ w% ^1 b( G4 ]" F( k8 G& G/ ?# B
#计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。
: l; l& S8 C: R& i& j; ^6 Paverage_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc`
4 }% N3 Y7 W+ q0 b$ Q# X9 Y8 r6 y/ \+ g" D  I- f; P0 Y* w1 M
#取上面平均负载值的个位整数 ; a/ u( b, K* Y- @. ~' r- Y
average_int=`echo $average_load | cut -f 1 -d "."`
8 J/ K/ z2 F+ m2 N6 r4 d( P/ x" t8 X" C6 I; ^
#设置系统单个核心15分钟的平均负载的告警值为0.70(即使用超过70%的时候告警)。
! }" K1 }9 P1 N% Aload_warn=0.70
& i# O8 J* k" r" B7 D; |
5 M/ ~. S+ @7 B; K$ V3 Z#当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0) ,直接发邮件告警;如果小于1.0则进行二次比较
) z5 {0 Y# e9 Z" ^if (($average_int > 0)); then 3 `' f, z3 }6 P6 {& X  k& G9 a: U
  echo "$IP服务器15分钟的系统平均负载为$average_load,超过警戒值1.0,请立即处理!!!" | mutt -s "$IP 服务器系统负载严重告警!!!" fuquanjun@xxx.com
: i3 D" l8 k% q0 g( s: o  else
- ]5 |3 y: B! Q4 o#当前系统15分钟平均负载值与告警值进行比较(当大于告警值0.70时会返回1,小于时会返回0 ) 7 c  @$ A8 M% c& z- x2 A
load_now=`expr $average_load \> $load_warn`
) ~1 ?/ E( \# h9 C" D
- g/ u0 @$ d6 G#如果系统单个核心15分钟的平均负载值大于告警值0.70(返回值为1),则发邮件给管理员
. Y; E4 h/ V, u  if (($load_now == 1)); then
3 y; t& L4 K0 Z" `8 K5 B9 w) m    echo "$IP服务器15分钟的系统平均负载达到 $average_load,超过警戒值0.70,请及时处理。" | mutt -s "$IP 服务器系统负载告警" fuquanjun@xxx.com
! U8 b& A. j' @( W8 m- r  fi
" S  D6 l* x/ ?; Lfi
2 }$ F1 V" n  A* z+ }# chmod a+x /scripts/load-warning.sh
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 00:48 , Processed in 0.016790 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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