易陆发现互联网技术论坛

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

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

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

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

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

x
在Linux系统中可以通过/proc/stat文件来计算CPU的使用率。其中各项参数说明:+ U6 f: e( n& s- u: V

. `/ f* Y3 W8 c* p( a9 E0 Vcat /proc/stat
3 P8 R8 E! z+ ?6 pcpu  8742195 15 754479 55626730 192455 0 32760 0 0 0
0 C- }+ d. B8 c, |' y3 xcpu0 326672 0 97560 7716403 21364 0 7494 0 0 0! E: \2 b1 M0 ?2 C0 V' `
cpu1 230096 2 109184 7784794 24447 0 5431 0 0 0
* ~- ]  j# r" A7 e  tcpu2 2498253 0 80762 5566047 26575 0 3556 0 0 0
' l0 H% T  d, T0 @2 q& `. X' N* W" Vcpu3 2733988 0 76288 5345517 18368 0 2986 0 0 0
- I' ?  [' q1 f. j* @cpu4 1268765 2 93512 6772088 32527 0 3460 0 0 0; w# ]$ o; u  R: |2 d
cpu5 577480 0 100944 7466708 19525 0 3660 0 0 06 J' |' h  A$ J) _$ f
cpu6 575574 0 99252 7464805 24467 0 2785 0 0 0& ~$ s+ G9 ], S8 d- L/ a
cpu7 531364 9 96973 7510365 25178 0 3384 0 0 01 `3 `9 O: H: l2 @3 a
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
4 z, v7 L& D' `% @ctxt 374979507
. Z  |4 Z) v9 X% I2 B& Y1 c2 fbtime 1694791989" {) ^& ^4 u3 D* `1 p  Z8 K
processes 2234872
3 r, y& }6 Z! D! K: R/ {8 _; }4 hprocs_running 4
! x& w& ]: B1 \- V9 V0 w3 q7 Xprocs_blocked 0' u" _9 i. _4 b' m
softirq 279664532 1 159117851 16412 20782044 785020 0 41986 18593620 0 80327598
3 \( ~' p( t3 I- |
) d# P' w# t4 H% N
& G; i! q# _% k( l
9 E2 i9 F7 _% w; G, y& F  N0 a1 h) `) E/ A2 }5 N# `# w
就拿第一行来说:/ d. z2 E4 A8 a; S

7 @3 h0 D; F  q) @2 U   cpu  8742195 15 754479 55626730 192455 0 32760 0 0 04 I" u/ P% u! k* @4 e
  _1 B( s4 \5 S
! |0 k9 L$ V, _5 W; G
第一个字段(cpu)是cpu标识。
+ l1 G% I' G$ L
8 m. [8 ^% [+ b) r% D' B第二个字段(8742195)表示是从系统启动开始一直到当前时刻,进程在用户态(user)下执行的时间积累。# n- U, k  J% Y) K7 \

4 S% S* ?- N% \. x. K$ p第三个字段(15)表示是从系统启动开始一直到当前时刻,nice值为负的进程所占用的CPU时间。
2 A2 t0 G, I9 K( H6 \, P4 [1 y3 A% z. k: T  {
第四个字段(754479)表示是从系统启动开始一直到当前时刻,进程在系统内核(system)的执行时间积累。5 U5 B' O; S5 D' e' }3 g6 D

" W. u6 t7 c5 z8 v: y8 M第五个字段(55626730)表示是从系统启动开始一直到当前时刻,处硬盘IO等待以外其他的空闲时间(idle)积累。% Y! j" k$ f% i/ d

; C; Z9 ?, P- I6 A% b; l第六个字段(192455)表示是从系统启动开始一直到当前时刻,IO等待(iowait)的时间积累。
1 Q. t% `- e  ^$ h+ X8 `' z) {4 g, J* x& i
第七个字段(0)表示是从系统启动开始一直到当前时刻,硬中断的时间(irq)。
3 K8 i; l. {4 \& A) x4 K( K/ D0 E8 u- v% Z7 Y, S+ n
第八个字段(32760)表示是从系统启动开始一直到当前时刻,软中断的时间(softirq)。
9 F: t1 q; O% Q1 {0 h3 N* C
+ O5 K% O% d+ p" t7 _; V" Y剩下的几行:% |; V+ V4 \" ~4 o
' f$ H0 o# j, |" x* ?/ D0 k
intr: 给出的是中断信息,第一个数为自系统启动以来,发生的所有中断的次数;后面的每个数对应一个特定的中断,表示该中断自系统启动以来发生的次数。. I2 [' j  T& A2 G  y" S. ^" R; l
3 X8 O. A- D& i; T4 E$ L! F
ctxt: 表示系统CPU发生的上下文交换次数。- O6 Q8 ]) o% J
4 T. j8 g" P3 S$ ?/ n! s) o" J( Y0 S
btime: 表示自系统启动到现在的时间,单位为秒。' S* c0 Q4 _: f' C' Z
' L: g4 n8 b5 O2 K
processes: 表示自系统启动以来所创建的任务的数目。) ?9 P# L  U3 I: G% ~
  A# ?; s6 n( N+ e
procs_running: 当前运行队列的任务数目。
# ?' }7 ]& k+ O, Y5 U% m0 d' U
2 S. [4 o; q% n1 J  X% O# ~' k2 g3 Qprocs_blocked: 当前被阻塞的任务数目,等待I/O完成次数。% K1 p& Z2 {. e# s' c
4 l4 u7 j" \0 p. C0 t
CPU的使用率可以通过如下方式计算:
, m5 _: `; H+ {! a- G" r4 F% E+ e/ C7 ~
cpu_usage=(idle2-idle1)/(cpu2-cpu1)*100
8 t% f7 z( N9 w- s; F9 D5 t) ?) t# C5 K: W1 B/ V. \4 `. D  I* @
cpu_usage=[(user2+sys2+nice2)-(user1+sys1+nice1)]/(total2-total)*100
, Z+ w# A- o5 j. v
) \6 n4 x! b9 h, u# n获取CPU使用率的相关脚本如下:
3 l# f$ H+ k- \( d2 V1 V/ a) g0 w0 M7 O# r+ ~1 F
6 f8 g; E; }' i/ c8 d4 Y
登录后复制 9 Q# G4 T+ ?0 u6 k
#!/bin/sh' I# _! H/ ?, U% `
#  \& S" B0 c! @2 C4 I; }& Y$ z
#脚本功能描述:依据/proc/stat文件获取并计算CPU使用率
; d; P2 k5 k. x/ e' W#
  S# s" q% B5 E* c0 C" B4 ?6 h' [8 Y#CPU时间计算公式:CPU_TIME=user+system+nice+idle+iowait+irq+softirq
. g) y. X" P( T6 V+ ]#CPU使用率计算公式:cpu_usage=(idle2-idle1)/(cpu2-cpu1)*100
' f, r" r) w+ I- {( `7 q6 ~' P#默认时间间隔* `+ i1 A  u5 m" @# ^
TIME_INTERVAL=5$ R4 y* }6 `' M2 o$ I+ H
# @6 \, Q: |# \+ F4 h8 M
LAST_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')+ d3 S6 ?" f- Y/ \- N( \' ]
LAST_SYS_IDLE=$(echo $LAST_CPU_INFO | awk '{print $4}')2 U0 D3 o, H. V1 T% V
LAST_TOTAL_CPU_T=$(echo $LAST_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')/ g+ H9 F# h/ ]4 ]
sleep ${TIME_INTERVAL}! q- y: H" j7 @* a6 d8 p
NEXT_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')
! C8 c$ m& u! k, dNEXT_SYS_IDLE=$(echo $NEXT_CPU_INFO | awk '{print $4}')
+ I, _* ?; d, B! z- y; a* QNEXT_TOTAL_CPU_T=$(echo $NEXT_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')1 n, e$ @( c- z6 Z

& q  V- q! _  Q( M) r0 y6 N+ a7 }  u0 l#系统空闲时间
$ P3 L/ @# z# l8 N2 kSYSTEM_IDLE=`echo ${NEXT_SYS_IDLE} ${LAST_SYS_IDLE} | awk '{print $1-$2}'`
3 y# N6 d; L/ C7 A#CPU总时间
/ d# z" ~) f' X; y1 hTOTAL_TIME=`echo ${NEXT_TOTAL_CPU_T} ${LAST_TOTAL_CPU_T} | awk '{print $1-$2}'`: H% i8 v' x. k; `" }: C3 |
CPU_USAGE=`echo ${SYSTEM_IDLE} ${TOTAL_TIME} | awk '{printf "%.2f", 100-$1/$2*100}'`# U, V/ i1 z! ~1 Z1 y8 K
6 @0 E' T1 \0 V0 X6 Q3 n
echo "CPU Usage:${CPU_USAGE}%"4 `1 t% C5 x! g, Z, s& A7 q. [

; A% M* D4 q' o' p( y7 I7 h' y) U# {% X9 U

* H+ l9 \+ H. l% M( @; X
! x2 x6 f8 u! F: f: V# I& w* ~  I6 q[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'
* q8 t6 u  j8 j' D7 e" \14.90 m5 h' q  k; J
[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)'
# K" Y9 s5 G8 {" |%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  n8 j7 B/ K. A6 s  D& q" I/ [
[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'& h$ ^- \/ b% k7 C  j3 `
27.0
: |# c& j( |* g; @# ]3 S/ u( V& z* l& j6 p/ m5 c: r
for循环脚本:
3 h& M3 H( |' i# a% u: v2 Rfor((i=1;i<=5;));  " Q% H6 @# v' q/ g5 |: Y& V
do   
; E/ o8 b9 `2 x- U, o" N    cpu_us=`top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'`7 I8 j2 C/ Q( [, \% E1 w  Z' P
    cpu_sy=`top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $5}'`
! u0 \! \) y( c: y6 ~    #echo $cpu_us
# i- O5 w. t, k- F4 h6 U9 d    #echo $cpu_sy- y6 w3 D6 X* g7 d$ W
    cpu_sum=$(echo "$cpu_us+$cpu_sy"|bc)4 t) h  H; T+ m2 R8 m# S! D0 }1 u/ n
    nowdate=$(date +"%Y-%m-%d %H:%M:%S")
+ `8 d6 d0 Y% q4 S* Q4 V+ B    echo "$nowdate CPU_SUM: $cpu_sum%" >> ./cpu.log, q/ n, g5 B& l, ~
    sleep 120* Y- E7 W2 S) Z' z$ o& z  W" h5 Q
done) h! k: O. u  v- E9 Z* j

2 ^+ {7 u8 k2 Q8 X/ K/ S
9 O; l; ]9 ~- B# x* h+ O
% N+ W3 `4 V9 Snohup sh cpu.sh >/dev/null  2>&1 &/ C  q( R* {2 t7 I

' b0 f* X1 G" ?; u
+ I7 S1 ?8 I( ^* G" N; I! m6 F: G" M

% y" z0 a" _3 E! l$ E; j+ O1 g& Q& s
9 f& |/ ^3 n: E4 ~

$ m7 B& v% u; @2 e, R- U- j4 N4 F5 D6 o1 i2 l4 X8 \; y
9 A2 o/ _" V" `+ F; y/ l$ \
 楼主| 发表于 2023-9-16 22:32:06 | 显示全部楼层
#!/bin/bash
2 w2 A4 V3 I! L9 z. s$ c3 D
  ]1 `5 w% g& {6 X# 获取ip! c2 n1 t- Z4 x9 T: m/ D
ip=`ip addr show eth0 | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print ""$2 }'`1 {; ~* \0 U2 E( ]/ D( u2 |
echo $ip
# C9 J8 U0 j# B6 ]ip_index=`echo $ip | awk -F '.' '{print $4}'`
9 ]8 M6 _+ \; s  f% i$ b! `$ c/ O* \& H, P4 }, o+ k
#计算cpu使用率& ?4 V2 m: q8 m" h2 X
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;}'`' z" q7 ]7 R8 S$ W- I" N2 \: c
echo $cpu
4 t3 q" c" I; ?2 r0 r, W, o2 f; ^) Z
0 M  C# i5 M8 ?$ F/ _+ j+ u#统计内存使用率
0 [& t7 j3 n# N0 t  Z' wmem_used_persent=`free -m | awk -F '[ :]+' 'NR==2{printf "%d", ($2-$7)/$2*100}'`3 U* n2 w/ n+ s" n
echo $mem_used_persent
 楼主| 发表于 2023-9-16 22:33:40 | 显示全部楼层
top 参数、含义、思路
7 f' F2 z; a& e4 v  S3 W查了一下top的参数, -n 参数的意思是 刷新一次就停止(只输入top 是会一直在刷新的)' `' {" m5 M" p  q2 L
Cpu 这一行有很多个参数,每个参数都有自己的含义:4 Y/ H4 a6 B( B
us 是用户空间占比
1 j$ m; h% V2 v$ `1 dsy 是内核态占比
0 T) K7 L+ }9 i2 _5 Mid 是空闲占比/ c3 T: v2 d: d( h2 w2 i0 j! s9 G
还有其它的都是各种场景的使用占比
* T: m9 c6 X6 c3 D. j) p所以我们是取出 id, 然后 100-id8 W4 R: _2 ]6 a: o* J

+ A9 O) F( M1 l, Z! N5 h6 _. A5 w
 楼主| 发表于 2023-9-16 22:36:19 | 显示全部楼层
2个CPU表明系统负荷可以达到2.0,此时每个CPU都达到100%的工作量。推广开来,n个CPU的电脑,可接受的系统负荷最大为n.0。7 x( a9 D' ?+ R" E
2、查看服务器cpu的总核数
( ~) ~9 A2 a- l# `+ c复制代码代码如下:5 X/ `' |+ Z# c3 V8 a- Y
  f; F; q1 T( i* `7 T5 U6 w
# grep -c 'model name' /proc/cpuinfo  或者       cat /proc/cpuinfo
7 m. v3 ]: }* |; y, \7 B! Z, D0 U7 O$ c8 d- k, E
3、截取服务器1分钟、5分钟、15分钟的负载情况
- R4 s- Y% W7 E1 n  K$ L复制代码代码如下:
% h- m- x. R; C2 Z2 u" f8 @4 z! D" k  ^2 w0 l+ ?8 k
# uptime | awk '{print $8,$9,$10,$11,$12}'
: O5 B: J. Q9 j  N* M% a   load average:  0.01,    0.02,   0.00
6 Y0 c+ I: G2 t7 C5 _! w0 v4、查看截取15分钟的平均负载
) I; q# O0 v8 C
- [1 ^+ ^4 B6 G1 ~复制代码代码如下:1 V3 S) f' L4 C/ _; |7 y3 ?
5 J1 h) {/ J; ^
# uptime | awk '{print $12}' (用 '{print $12}' 这个获取的不够准确,如果都用awk取第12个字段的话,结果有可能为空了。而用$NF表输出最后一段的内容)
) `9 x$ w# A6 z! k# uptime | awk '{print $NF}'
5 i, S: l/ p7 G7 n) |/ o* z
6 V5 e$ Z9 @! q) j! k% b: l5、编写系统负载监控的脚本文件:
' i( D" M9 G  I( n) p2 s0 O复制代码代码如下:
" W$ [2 s# r; f$ c8 i6 V
1 I% c6 P( S4 E# vim /scripts/load-check.sh+ Z" C( W3 D2 `4 |* W2 A
[code]4 C' Q4 ~; k4 a; d* \
#!/bin/bash 3 a# y* R& A: W- {: U8 D+ d+ p& d
#使用uptime命令监控linux系统负载变化
% c. f% [( T9 q5 j3 i& e. n ' ~% V, b+ B3 ^- ?1 Z6 v4 T& W
#取系统当前时间(以追加的方式写入文件>>)
7 F6 s- B% N5 j- }( w" T) Wdate >> /scripts/datetime-load.txt    * B7 E) r7 t  ^
1 Y1 \0 p4 |) h; c4 ^
#提取服务器1分钟、5分钟、15分钟的负载情况
& e: P) _0 y+ fuptime | awk '{print $8,$9,$10,$11,$12}' >> /scripts/load.txt + Z  Y; {2 p8 c3 W; l, C

/ W- u) ]/ I6 `9 F9 K#逐行连接上面的时间和负载相关行数据(每次重新写入文件>) 7 ?5 n# n# w1 a- e+ d
paste  /scripts/datetime-load.txt /scripts/load.txt   > /scripts/load_day.txt
. n( X, L& ?4 e# chmod a+x /scripts/load-check.sh
4 h2 H4 C2 s! d* F8 t1 ]8 r6、编写系统负载结果文件邮件发送脚本:3 X4 E4 N# I% d
复制代码代码如下:0 }$ E; o  V3 b7 A( q9 X/ ^

- Q9 X# q$ o" v+ F# vim /scripts/sendmail-load.sh
8 j% D, s6 O* U& E+ C& q4 y# j#!/bin/bash # j  C8 e/ T1 z$ K0 A+ }
#把系统负载监控生成的load_day.txt文件通过邮件发送给用户
$ u% [$ S, ^  j( v8 c, i
* K. h1 |6 c6 w, m  Q; e#提取本服务器的IP地址信息 % K! c7 u9 L+ p
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
; k3 f2 _9 U8 }/ b' n* S 0 Q7 o3 S2 w; k/ C' h7 X
#提取当前日期
0 \6 d+ i% |3 g9 A* R0 dtoday=`date -d "0 day" +%Y年%m月%d日`
9 B+ K' j  O% k! ]2 l
$ @2 r( p" \) g9 J" Y6 p" F& z& Q#发送系统负载监控结果邮件
$ Y5 y5 U# j( Pecho "这是$IP服务器$today的系统负载监控报告,请下载附件。" | mutt -s "$IP服务器$today的系统负载监控报告" -a /scripts/load_day.txt  fuquanjun@xxx.com$ @. p$ ~5 _% Y4 a2 H
# chmod a+x /scripts/sendmail-load.sh2 B6 k! u" c; C! E
7、编写系统负载监控的脚本文件:3 t4 s8 p- S; J- d3 J9 _/ n9 L. _
复制代码代码如下:; W+ m' [* d  Q; b1 D8 d+ d- ^

7 P  M- J( ~3 I/ ], I# vim /scripts/load-warning.sh. `) r5 e; x, k/ @" F1 Z) l
#!/bin/bash
4 z0 V- z5 {/ B9 c7 Q$ r8 ^+ `! f% U#使用uptime命令监控linux系统负载变化 5 {/ r& ]2 a' D& I

0 I# A. d* w+ B0 X5 t  T4 ~#提取本服务器的IP地址信息 1 \3 i  `6 ?5 i; f
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` ' ?* r9 O$ p( x# l% A: P  V

$ w9 Q+ @5 a/ J- g9 {! e#抓取cpu的总核数 % T- B2 ^" o2 C5 a( t- p5 K7 O; m
cpu_num=`grep -c 'model name' /proc/cpuinfo` 0 E' W, q, }. T& r2 k- A* m% `

) ]( b2 b0 {. f/ F#抓取当前系统15分钟的平均负载值
, A4 y2 L5 u" u  ]load_15=`uptime | awk '{print $NF}'`
' n2 N$ K5 g9 @2 g: i" Y
; ]0 A/ Q+ b- D7 h* |#计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。
9 S1 x( F0 ^2 X2 a" Y& x% M6 h+ _average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc` , W& q' E+ f+ G& S! {

8 ?# j& |: ]" i$ Y3 z( E* A#取上面平均负载值的个位整数 % V, C3 a3 M! F) y2 I+ T& y
average_int=`echo $average_load | cut -f 1 -d "."`
$ K# Q; b& d- C0 A* a% `4 l
: ?2 c5 g0 Y  O* O8 B' y#设置系统单个核心15分钟的平均负载的告警值为0.70(即使用超过70%的时候告警)。
& g! D# c3 {, ?: n9 i8 ?4 u4 K% fload_warn=0.70 " X% }4 n( P) o& P
% j+ }# B+ H* j/ v
#当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0) ,直接发邮件告警;如果小于1.0则进行二次比较
( h2 M: N3 d, Y) u; B9 [/ B- @if (($average_int > 0)); then
" q& V- e. K" B4 l8 o      echo "$IP服务器15分钟的系统平均负载为$average_load,超过警戒值1.0,请立即处理!!!" | mutt -s "$IP 服务器系统负载严重告警!!!"  fuquanjun@xxx.com
, X8 a- }; p3 D2 d0 ~else - J0 }& l: {% t/ O: |6 f
#当前系统15分钟平均负载值与告警值进行比较(当大于告警值0.70时会返回1,小于时会返回0 )
5 Y! }* r; N6 a: tload_now=`expr $average_load \> $load_warn` , K. X$ \2 N9 q8 U
9 E; u$ p) G9 q: o# N
#如果系统单个核心15分钟的平均负载值大于告警值0.70(返回值为1),则发邮件给管理员 # e  f0 p! y4 `  k- x
if (($load_now == 1)); then 5 R, ^; C1 A$ k" u( D' j
    echo "$IP服务器15分钟的系统平均负载达到 $average_load,超过警戒值0.70,请及时处理。" | mutt -s "$IP 服务器系统负载告警"  fuquanjun@xxx.com 9 A: f; E/ L, N, s
fi
! c( v0 I/ j* s% H3 u- Rfi) ^% I* u3 p1 c+ P) q7 ?
# chmod a+x /scripts/load-warning.sh) g3 {' Y4 |6 _4 \% ]; l" ~' u9 @* R3 R
三、监控服务器系统cpu占用情况:
! N& ~1 N3 S1 u3 r& }8 }. _! q6 d) v% m3 T3 r% R. a2 P0 U3 d! b
1、使用top命令查看linux系统cpu使用情况:
' }  ]9 ^8 U. H6 u8 V复制代码代码如下:
+ }! o. E$ |# C3 E/ j2 q- D( C4 C0 I( H7 b
#  top -b -n 1 | grep Cpu   (-b -n 1 表只需要1次的输出结果)0 t4 H" C- T( O3 J
     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%st2 l) s* P8 T8 ]. I

( e6 p$ e* k/ ~& ^2 a, i2、查看截取空闲cpu的百分比数值命令(只取整数部分):% D, T. a  k0 U
复制代码代码如下:
, h7 x7 }; E0 u6 V; Y* P# \( ^, ]& O6 l7 V. Y9 a
# top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."
5 T5 j! O! f6 }; `1 e% w; _: L) I0 G
4 V* r/ y2 \- f7 v4 i5 |9 i3、编写cpu监控的脚本文件:8 ]$ A5 [" @' T! `! Y
复制代码代码如下:
+ U* M; c: r- k+ [8 |! n
) T; z8 K* R" Q" e# vim /scripts/cpu-check.sh
- D! E  _- C8 r" u& f8 A; ]) d  D' c#!/bin/bash
9 ?, F4 v. B: }9 P' e/ Y. y#使用top命令监控linux系统cpu变化 # z9 q! z* \3 C, ~6 f& R$ `0 L0 m3 W

( q+ p) a1 m$ |#取系统当前时间(以追加的方式写入文件>>)
: |) z0 S+ }, H3 d8 I* |date >> /scripts/datetime-cpu.txt   
# b. O. j  q& k3 e  ?* y
/ b* T% J. t3 d1 r#抓取当前cpu的值(以追加的方式写入文件>>)
7 L- C1 W# ]9 v+ L% }top -b -n 1 | grep Cpu  >> /scripts/cpu-now.txt  / p+ r+ l) R* c' H# o: r" y5 @
6 [2 V( j3 ?  H. W- \4 {  }3 B7 d
#逐行连接上面的时间和cpu相关行数据(每次重新写入文件>) ) \( j" Y- k9 `; U
paste  /scripts/datetime-cpu.txt   /scripts/cpu-now.txt  > /scripts/cpu.txt
5 K8 P8 a) f& e" [2 C" P) G; N# chmod a+x /scripts/cpu-check.sh
8 D0 K- g9 _& H4、查看CPU监控的结果文件:1 d+ b) ]% d. R" u- r" V8 S: b
复制代码代码如下:( `$ G# F9 J& n" M6 r

& A, l- Y* G. J9 x8 e9 L# cat /scripts/cpu.txt- }1 n6 I9 A- W3 {" C( _$ L  n
$ s& `3 n- R: d+ e
5、编写cpu结果文件邮件发送脚本:
/ U) w+ k( D- [) O0 l复制代码代码如下:
% B' P+ G# R$ H- P8 x5 X0 ?+ ^
( V) }/ Q' H. t* {# vim /scripts/sendmail-cpu.sh
) d# S! E4 S/ k4 t9 x3 m#!/bin/bash 9 Y! T, [- f7 d0 g/ f
#把生成的cpu.txt文件通过邮件发送给用户
4 F( J& E2 Y9 k3 z / i, A  c/ n$ R6 C0 f8 F
#提取本服务器的IP地址信息
5 D0 w# C4 z+ N' c; _4 PIP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
, a) q, {) e5 V! m* T! L 3 |+ }  y# V6 o1 ]7 h! o( n
#提取当前日期
- V% u1 g& }6 ]6 F- n. Ntoday=`date -d "0 day" +%Y年%m月%d日` & B- f: g. i  L! K1 T) }

9 j: H, T3 O; X' h: i! h6 y* h! `#发送cpu监控结果邮件
- b* d4 ~3 N' `; r1 ?echo "这是$IP服务器$today的cpu监控报告,请下载附件。" | mutt -s "$IP服务器$today的CPU监控报告" -a /scripts/cpu.txt  fuquanjun@xxx.com
  ]0 d4 Y; Y! X # chmod a+x /scripts/sendmail-cpu.sh
3 X/ r2 A3 [5 s6 z* e( v9 p) b' N : M& a3 b; ^! O* n
四、监控系统cpu的情况,当使用超过80%的时候发告警邮件:
( O, M! z( [1 \% B1 i1 d) t
/ ~3 J& Y' W  [8 B( X复制代码代码如下:- z5 \+ v! d3 m& I* ]1 A

+ V. L  y9 m  A# vim /scripts/cpu-warning.sh7 T' I9 K0 l4 t' _2 P9 ^
#!/bin/bash
5 F& P  b: i+ r$ d" S0 X#监控系统cpu的情况脚本程序 6 z* T. C  J1 H, u2 K! }

" ?9 @9 g) {( M" R/ ]4 r4 r& o) [#提取本服务器的IP地址信息
" X3 l0 H$ F$ Y  D0 jIP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` # H. F4 X4 O! V

9 _8 }) e0 {- M8 {6 c. X#取当前空闲cpu百份比值(只取整数部分) # z) F0 j8 D) b+ Z. o* V
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."` " C1 D2 ~* T2 ?7 R2 R8 q* U2 l
7 q+ Y. l0 ?5 C2 @4 p" C
#设置空闲cpu的告警值为20%,如果当前cpu使用超过80%(即剩余小于20%),立即发邮件告警
! T# I; m7 K% Y# n* y- p  E% U( ?5 \# `if (($cpu_idle < 20)); then
; o7 Z( I( ?1 n, T      echo "$IP服务器cpu剩余$cpu_idle%,使用率已经超过80%,请及时处理。" | mutt -s "$IP 服务器CPU告警"  fuquanjun@xxx.com & Z9 U( {9 K: A3 E$ T
fi: Q' z( l% T( j
# 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使用率。
$ a; t3 ?  m8 v8 ~
- [- A2 O, s8 S  _$ E& p  T- S
#!/bin/bash
- I$ C/ X9 J! c  [, A- t% n0 r( i* v& [+ _5 J9 _) \
output=$(timeout 60.1 pidstat 60 -p ALL)& K; @$ q" o  @! g8 H" o' J
/ w2 \8 \6 w% L% _2 l( B
IFS='( m0 D: @" h% Z7 W  Z
! u! [! [, N& Z: u+ W
'
- P5 x6 s1 [3 h! S
& a7 i( N  a7 M7 [4 ]for line in $output; do7 k; A" A4 R9 |7 ?4 M9 a* }

, ~0 `9 z: q& r( B/ ~    # extract N-th column with awk
2 c+ H# S/ L7 e- }5 j# Y
2 H* g1 V6 A" F" y7 |' h3 z    pid=`echo $line | awk '{ print $4}'`    # PID- S" O+ g5 K9 S! L) I( Q9 e, r8 k

3 U6 M+ }! o4 {! Y9 I    pcpu=`echo $line | awk '{ print $9}'`   # percentage CPU
6 u; A7 B) W6 `! W5 D
5 N- x0 P, T' g: F1 |    cpu=`echo $line | awk '{ print $10}'`   # CPU ID8 R$ }  E# h2 H- m* r
, h" D$ V0 r& a# B2 d; d
    cmd=`echo $line | awk '{ print $11}'`   # command
* c1 u7 F. s' c% n3 x8 K0 K
6 r. q0 z( D: o* K# t3 N    echo "$pid $pcpu $cpu $cmd"
- Z1 r8 f( t. |( ~, \; Q
1 U6 |6 ^& z: Edone
 楼主| 发表于 2023-9-16 22:42:49 | 显示全部楼层
$ top -bn1 | grep load | awk '{printf "%.2f%%\t\t\n", $(NF-2)}'8 @1 d- h: ~- A) T" f  K
1.30%                * o* Q4 `% l, K1 M$ x* k
0.10%               
$ x" w/ B8 m# x. W3 p' e0.00%                6 u* j  Z4 M7 f; [% Z, `( k% |
. u+ e( m4 b+ q* M- g( W5 a
$ top -bn1 | grep load # H+ @/ \2 K4 I4 z+ L
top - 22:41:46 up 23:08,  2 users,  load average: 1.30, 1.28, 1.34
, Z2 }+ k0 X+ B$ l7 Q  2089 root      20   0  385436  14672   9064 S   0.0  0.1   0:05.97 lloader
1 `& M6 @4 K: n' {  2090 root      20   0   81668   3904   2936 S   0.0  0.0   0:01.08 lloader
- c" n1 t  J- l
 楼主| 发表于 2023-11-10 16:26:47 | 显示全部楼层
# vim /scripts/load-warning.sh
' A3 `% [, e+ e# {#!/bin/bash 6 Z. y) P7 G4 n: R; _
#使用uptime命令监控linux系统负载变化
; X2 F/ {9 ?$ }' n1 a& r( g' a8 D& l8 [0 W
#提取本服务器的IP地址信息 7 H5 V/ w2 m! b) M* E
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` ; U& X/ t' H1 U/ S  V( f4 A; Z

' G' H2 z. L+ s- t( l& a( J( m#抓取cpu的总核数 2 v) `% C4 H  e* K; Q
cpu_num=`grep -c 'model name' /proc/cpuinfo` , Q  @, n6 O* n4 R4 E( A
5 k2 r  \6 t# @1 F* `1 V2 V. [
#抓取当前系统15分钟的平均负载值 $ J3 y+ P4 w4 i* _3 y! A+ t* X
load_15=`uptime | awk '{print $NF}'` % K: c7 C* q/ @/ Y

9 c, r8 E$ h' N' C; q3 E: m$ V0 Q#计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。
% q: a" z. ~( ?0 V* ]7 k. Raverage_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc` / a) i6 C  W( S) j4 e

$ i+ E( Q( {" s; G* j#取上面平均负载值的个位整数
7 S2 ^3 |/ G4 j- I, Gaverage_int=`echo $average_load | cut -f 1 -d "."` 3 y7 X7 S5 Q2 g% j9 {9 p
  y' P  T" M" @/ b/ z
#设置系统单个核心15分钟的平均负载的告警值为0.70(即使用超过70%的时候告警)。
5 j" P* R# O8 f' P' Uload_warn=0.70
" q" ^2 Y& a8 }* N% D6 T% c
" m# h, X3 u+ z8 H0 T( S, G#当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0) ,直接发邮件告警;如果小于1.0则进行二次比较 8 V  P$ U7 ]; l$ w& ?
if (($average_int > 0)); then 4 t4 k0 Y- D6 P/ H' R# {6 n
  echo "$IP服务器15分钟的系统平均负载为$average_load,超过警戒值1.0,请立即处理!!!" | mutt -s "$IP 服务器系统负载严重告警!!!" fuquanjun@xxx.com
1 Y6 D' Z6 {4 K# i  else 9 N  V0 g% m0 {. K, s% f' d6 U, h
#当前系统15分钟平均负载值与告警值进行比较(当大于告警值0.70时会返回1,小于时会返回0 ) 9 S2 j3 F" f% j! M3 j; T
load_now=`expr $average_load \> $load_warn`
& X; \: _; @. ~$ F7 F/ L" m4 f! o9 u9 I* |" _3 {
#如果系统单个核心15分钟的平均负载值大于告警值0.70(返回值为1),则发邮件给管理员
% C* i; I. d- }& y& f5 A  if (($load_now == 1)); then
3 F- |& A. P5 @    echo "$IP服务器15分钟的系统平均负载达到 $average_load,超过警戒值0.70,请及时处理。" | mutt -s "$IP 服务器系统负载告警" fuquanjun@xxx.com
% f( @9 x' p0 P" t0 N) N" A4 P  fi
$ c) R+ l8 j* \+ C* Xfi
+ i9 I2 z" c1 C& g5 P5 q* n# chmod a+x /scripts/load-warning.sh
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

GMT+8, 2026-4-8 21:31 , Processed in 0.057164 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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