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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2023-9-16 22:28:49 | 显示全部楼层 |阅读模式
在Linux系统中可以通过/proc/stat文件来计算CPU的使用率。其中各项参数说明:
0 Z# K) P. o/ k5 o: Z- w
7 K% p6 _" U6 O1 B/ l2 zcat /proc/stat   P3 e: p) P% I
cpu  8742195 15 754479 55626730 192455 0 32760 0 0 0
( m1 ^& L' I0 j2 Q0 N* Y" v1 ecpu0 326672 0 97560 7716403 21364 0 7494 0 0 03 o& i" t: J; t6 |7 G0 n, V
cpu1 230096 2 109184 7784794 24447 0 5431 0 0 0
5 t6 L$ @1 S& Acpu2 2498253 0 80762 5566047 26575 0 3556 0 0 0. W4 w* v7 C  v5 z% V. F8 M
cpu3 2733988 0 76288 5345517 18368 0 2986 0 0 0! c7 w+ D" G+ j4 I
cpu4 1268765 2 93512 6772088 32527 0 3460 0 0 0
, C" d/ y0 E& Icpu5 577480 0 100944 7466708 19525 0 3660 0 0 04 ?/ T0 ^# b: |' k, m$ j2 [7 D0 t# I
cpu6 575574 0 99252 7464805 24467 0 2785 0 0 0/ H/ \  c$ ~. t
cpu7 531364 9 96973 7510365 25178 0 3384 0 0 0
" A' _+ t% L, sintr 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 00 m( C' z1 l2 o! h
ctxt 3749795071 U" t/ ]  c) N  u
btime 1694791989
5 w& v5 R, {/ S1 z2 r9 ~& J' Oprocesses 2234872
8 T! L: f) V4 D  Qprocs_running 4
- e, E1 Z) R% e) U! x6 w/ S2 Eprocs_blocked 0
8 ]$ j- q" B& @3 ~) N7 S7 xsoftirq 279664532 1 159117851 16412 20782044 785020 0 41986 18593620 0 80327598- ^; m% f9 M% y4 j- Q! v3 [. W$ {
9 c, n' v3 O* M3 h% ]
. D; _5 |! k3 T

8 K. U7 l/ X- K$ D/ J) R" Q. j- E9 K1 e3 E& A
就拿第一行来说:+ A; Q' ~  P9 K2 |- b/ H9 y& d% E
, @1 O9 G8 x- F# e7 h9 ~7 C
   cpu  8742195 15 754479 55626730 192455 0 32760 0 0 0& ~0 ]/ [( Y+ C& r7 Z9 c

) V% U' q( g3 i. F
; Y' m" G5 d( ~, t第一个字段(cpu)是cpu标识。
+ I. y; v/ T. ^9 N: R/ L( U9 P2 X/ J0 [) n) \0 T
第二个字段(8742195)表示是从系统启动开始一直到当前时刻,进程在用户态(user)下执行的时间积累。
" n; y( T7 y- C) y  Q# K2 K0 h) i7 ^# g  e, A
第三个字段(15)表示是从系统启动开始一直到当前时刻,nice值为负的进程所占用的CPU时间。1 k/ X( j/ Q( O7 F

& p4 U' k) g" S9 S3 t7 i" X9 x) i第四个字段(754479)表示是从系统启动开始一直到当前时刻,进程在系统内核(system)的执行时间积累。
1 U0 D4 k) J! M+ e( v7 ~
; A% U8 W* U6 g8 J1 w第五个字段(55626730)表示是从系统启动开始一直到当前时刻,处硬盘IO等待以外其他的空闲时间(idle)积累。
" [+ T, `- i5 l9 i1 {5 ~( X3 Y- g3 j
第六个字段(192455)表示是从系统启动开始一直到当前时刻,IO等待(iowait)的时间积累。! D2 r/ t: t3 z! U- A+ Z
. k# v( @5 B5 C" n, u- E
第七个字段(0)表示是从系统启动开始一直到当前时刻,硬中断的时间(irq)。
/ B1 }' f; h: b6 E5 R( C7 F) J  _0 x' Z8 O% L$ ~
第八个字段(32760)表示是从系统启动开始一直到当前时刻,软中断的时间(softirq)。8 p/ t5 j8 G; W9 `/ H- N$ _

) a' e' U/ ~5 {+ R剩下的几行:
" w3 b8 A; C8 M/ b* e5 v: t  t' u/ o6 L
intr: 给出的是中断信息,第一个数为自系统启动以来,发生的所有中断的次数;后面的每个数对应一个特定的中断,表示该中断自系统启动以来发生的次数。
! h# g1 R! B. k4 x" Y) W3 z: a
9 ^6 I! @- ?4 \) Octxt: 表示系统CPU发生的上下文交换次数。6 q% y; \& M% z

  g' @$ h7 S( q! e7 lbtime: 表示自系统启动到现在的时间,单位为秒。) x" M; r* L. ^
' B7 Z; \" u2 \+ m( V' J
processes: 表示自系统启动以来所创建的任务的数目。
- b$ I* h; M4 g  w( e# h
& n2 Q" {0 I; {- yprocs_running: 当前运行队列的任务数目。6 c" K) x" e; L7 Z9 C
* T# r2 |$ s/ M% X
procs_blocked: 当前被阻塞的任务数目,等待I/O完成次数。: V( R7 N. k8 T, }% [6 I; Y7 ?. i
! ?( W: O" F! }% Y- |
CPU的使用率可以通过如下方式计算:1 b; `3 a6 K; Z+ T- Z* _/ V! I

! [: N; ]4 x! o7 L& U* I4 lcpu_usage=(idle2-idle1)/(cpu2-cpu1)*100
( ]+ J  a0 W5 u0 y3 o1 V: [/ `) ]3 W+ K+ R9 @3 l
cpu_usage=[(user2+sys2+nice2)-(user1+sys1+nice1)]/(total2-total)*100
7 ~# T( d* ]5 p' T
/ Q8 a. S# }: d: [# \7 T获取CPU使用率的相关脚本如下:
* B: H8 b8 [: O0 G3 r( l3 p
/ w% x  R+ R; Y( D' Q" J( I0 ?* P( u  A9 J
登录后复制
; _* ?! F. D/ l/ k+ L) T0 ]#!/bin/sh
7 H, N2 M( y0 O6 I: A! o#
6 ~: O, |! p! \1 B3 k+ ]0 ?#脚本功能描述:依据/proc/stat文件获取并计算CPU使用率: u$ Z3 i: E7 i% L+ a' i, T2 L5 n
#
5 o8 P5 b7 `. R6 \5 i! W6 y#CPU时间计算公式:CPU_TIME=user+system+nice+idle+iowait+irq+softirq( N4 X& C" [7 \& G- N
#CPU使用率计算公式:cpu_usage=(idle2-idle1)/(cpu2-cpu1)*100
1 M0 [. Q1 `' |$ x/ p3 z#默认时间间隔
3 ]" l4 k! V/ d5 Q6 k4 g: GTIME_INTERVAL=5& k8 L& \1 `: ^" F
' Z0 s9 _5 D, U; F( Q6 o3 \; D
LAST_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')% _" C/ L& p: e( I, r
LAST_SYS_IDLE=$(echo $LAST_CPU_INFO | awk '{print $4}')- q! Y. E( Q( w
LAST_TOTAL_CPU_T=$(echo $LAST_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')
7 V# X4 v) `2 F6 y$ osleep ${TIME_INTERVAL}1 c1 s% ]5 a' @, H7 C- J3 L4 Q
NEXT_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')
/ g& ]  S( |" Q. ?. G7 F3 @NEXT_SYS_IDLE=$(echo $NEXT_CPU_INFO | awk '{print $4}')$ e# J. r% c& a" V
NEXT_TOTAL_CPU_T=$(echo $NEXT_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')9 H) g( Y6 h9 x+ I* `: v) Z/ j
" Q- v% ]5 m  T! F6 Z
#系统空闲时间: U: K! Z5 u( q& q8 g! m: P# N; _2 f
SYSTEM_IDLE=`echo ${NEXT_SYS_IDLE} ${LAST_SYS_IDLE} | awk '{print $1-$2}'`
6 [, S- i/ s& w0 O6 A5 A3 F#CPU总时间  {0 H  N0 c3 P, Q
TOTAL_TIME=`echo ${NEXT_TOTAL_CPU_T} ${LAST_TOTAL_CPU_T} | awk '{print $1-$2}'`2 S+ C" v. R# v5 _( P4 J
CPU_USAGE=`echo ${SYSTEM_IDLE} ${TOTAL_TIME} | awk '{printf "%.2f", 100-$1/$2*100}'`; s3 L' W  h8 f* N5 n7 d3 d( U
4 C* {2 Z* s5 E  ~2 b
echo "CPU Usage:${CPU_USAGE}%"
3 p8 D, t& K) @9 S
) k5 e* W  K! G5 f% y8 i7 s- Y# O( N% @* _

1 u! u( z# Z6 J* Q. i6 e0 I8 f4 A. A5 I3 d5 _
[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'6 M3 T  H; M1 D8 @, r* N, t
14.9# {2 G1 e0 A! I$ l* @( }
[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)'
( Q+ T1 m" P$ Q%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
3 P( S' {3 e; J6 h1 S[devops@j_01 jinshantongji]$ top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'
' x. A$ C% P( W, H! e! |, ~# k27.0
1 Z" c0 C6 F6 Y+ q* v5 A/ l* Q/ z% d5 Y
for循环脚本:
6 G* G* D4 O/ L! s4 ~/ H% {! xfor((i=1;i<=5;));  
# K5 J. G- H* n) [. N: Ido   
+ m. g4 `) @7 h, Z' t$ [/ x; W    cpu_us=`top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $3}'`2 R7 c% x3 O( }4 C4 R
    cpu_sy=`top -bn 1 | grep 'Cpu(s)' | awk -F'[" "%]+' '{print $5}'`
% E) j3 A) X+ _. F0 n' v' s, Y    #echo $cpu_us
! |$ Y4 x6 S. D$ E3 K; s2 V    #echo $cpu_sy
, ^$ }) d6 c$ G5 s% t    cpu_sum=$(echo "$cpu_us+$cpu_sy"|bc)' U+ ]' j& M9 O- J) I
    nowdate=$(date +"%Y-%m-%d %H:%M:%S")
) B; c4 i1 l% r7 Z    echo "$nowdate CPU_SUM: $cpu_sum%" >> ./cpu.log3 _6 C  I! n/ U/ s0 f: m
    sleep 120
6 `7 }# \* d3 |" U0 |done
' H' S' F' P3 i0 N4 t' A
+ H) b7 X# H/ J- W( {8 n: o6 c' i- R& z$ \' R

5 M( Y( ]9 e, F: u! }nohup sh cpu.sh >/dev/null  2>&1 &3 {/ H4 @  W! q0 O, e
5 ~: H  |5 x1 V2 d% M( z3 P; s

, Y5 d/ L6 @5 z1 j6 k$ X% Y% {$ `' Q* ?' |2 @( H* e

9 G7 f1 e7 X3 y4 ~# r8 N* i% t! m* N7 w. X, l4 o+ x

6 \5 m# p0 }- H* h: u/ W% n, l' D4 b( m9 s

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:32:06 | 显示全部楼层
#!/bin/bash
6 m2 i5 v+ E- u+ O; s% u( o8 s2 f* Q
# 获取ip# L1 C/ T! K- T8 Z# b/ n
ip=`ip addr show eth0 | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print ""$2 }'`
' S, u7 O. h8 D1 ?echo $ip
9 t5 U# ]) D% [8 Mip_index=`echo $ip | awk -F '.' '{print $4}'`
3 n, a$ h4 H1 u( l
# Y. s) C2 m# F+ V: w/ R% X#计算cpu使用率
3 u4 @3 X. d8 f' Y  kcpu=`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;}'`$ I" c' O$ H9 c/ @8 @0 O. B# W* Z
echo $cpu
$ c# Y5 S: f8 i+ f/ A4 T$ F. ^$ M. }; k& V
#统计内存使用率
. j5 X; S: f5 [4 E( nmem_used_persent=`free -m | awk -F '[ :]+' 'NR==2{printf "%d", ($2-$7)/$2*100}'`9 n3 m( I* C$ J3 Z+ i4 g8 U) t
echo $mem_used_persent

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:33:40 | 显示全部楼层
top 参数、含义、思路+ h* _* O* ~. Q0 A
查了一下top的参数, -n 参数的意思是 刷新一次就停止(只输入top 是会一直在刷新的)% b! J$ M1 H: I8 A+ ^
Cpu 这一行有很多个参数,每个参数都有自己的含义:+ D: k) f: |$ Q  p8 w
us 是用户空间占比1 a' K/ p! @, H% d
sy 是内核态占比
: f+ V0 |/ H  k; Y" \2 mid 是空闲占比/ S8 q" A" d) C# g; A( E
还有其它的都是各种场景的使用占比
4 T6 }9 N* |5 E4 \0 A所以我们是取出 id, 然后 100-id4 X" u8 C+ j  O, }, M# d' i, [
$ w% ~7 A- l* q  e

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:36:19 | 显示全部楼层
2个CPU表明系统负荷可以达到2.0,此时每个CPU都达到100%的工作量。推广开来,n个CPU的电脑,可接受的系统负荷最大为n.0。
4 \9 Q2 K- K, {9 _! C4 F2、查看服务器cpu的总核数7 l- Q' ]/ R9 e/ M# U5 D' D
复制代码代码如下:8 w* [1 s/ c# t$ v( i: T

' T4 j" D( D* o+ s' T7 M+ t # grep -c 'model name' /proc/cpuinfo  或者       cat /proc/cpuinfo
0 e: H, f! t  o& M/ T5 f, I6 A( I$ O5 y2 @
3、截取服务器1分钟、5分钟、15分钟的负载情况: x6 n- l& ^) ?0 D( k
复制代码代码如下:) S# b. {/ n4 d6 d9 x; M) \' a7 j( f
+ L- k- h! A: ~+ h
# uptime | awk '{print $8,$9,$10,$11,$12}'7 ~  R  I; w: S% a; t
   load average:  0.01,    0.02,   0.00
, W! |* {0 a" b$ g0 q4、查看截取15分钟的平均负载# A6 e" j0 X* G. C( f' y6 S% J
6 b3 w& }( t2 r0 {: `2 r7 m
复制代码代码如下:
, D$ q% Q5 U( P# ?0 w
% _# z8 d. r6 E, _4 R. e# uptime | awk '{print $12}' (用 '{print $12}' 这个获取的不够准确,如果都用awk取第12个字段的话,结果有可能为空了。而用$NF表输出最后一段的内容)& }' A' }6 V: e& @  I
# uptime | awk '{print $NF}'
7 p2 T% X6 |; p6 c  q: n# x
3 q% y2 Y% O1 @* U( Y5、编写系统负载监控的脚本文件:
+ N0 m( K% \* e0 ]5 F3 p) w复制代码代码如下:5 s8 u" w( F( m5 I; x

7 m4 S3 F8 O9 x% u( N& I# vim /scripts/load-check.sh6 B: I% I9 P5 S, t1 k2 j$ O' u. [
[code]/ g; V$ Q# Q- o7 C# K0 N  O
#!/bin/bash / V. ]! K9 B0 p8 u- C% e" D
#使用uptime命令监控linux系统负载变化 + V1 b* u3 R2 X; `! f6 }
. k! U+ l9 ~8 Y! R
#取系统当前时间(以追加的方式写入文件>>)
! A6 d; d% J/ W3 P: w9 w6 Xdate >> /scripts/datetime-load.txt   
- E- b3 V8 |* H7 @  O
9 q! }6 z( j. w$ H( l  H#提取服务器1分钟、5分钟、15分钟的负载情况 ; O9 W6 E8 j5 _5 `$ t3 Q
uptime | awk '{print $8,$9,$10,$11,$12}' >> /scripts/load.txt
# E9 D! J; J& Y5 l0 Y* r% V . r! k6 u$ B4 W. C9 X! j
#逐行连接上面的时间和负载相关行数据(每次重新写入文件>) : }' X9 o& F0 d5 Y
paste  /scripts/datetime-load.txt /scripts/load.txt   > /scripts/load_day.txt
. g9 ~# e2 c1 _! k+ W) T! h# chmod a+x /scripts/load-check.sh
  f+ u% b5 U8 a: i' S% q6、编写系统负载结果文件邮件发送脚本:) e1 `6 G# q' m9 r8 j: o3 `# o# t
复制代码代码如下:) t+ P: D0 R; ~! o

5 K. G% R1 O- Q6 d7 v& T$ G# vim /scripts/sendmail-load.sh
/ F5 D+ }5 B1 y; B#!/bin/bash
! C6 Y1 m5 \# A1 l#把系统负载监控生成的load_day.txt文件通过邮件发送给用户
# Y6 [( p1 ?8 _+ E: Y$ ^' i
% o6 q" i0 l  [- }% j. J- w+ ^#提取本服务器的IP地址信息
! n) m- k) H* a4 d! B, Y8 b* x" hIP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
' V$ B8 K; [6 ], ^- q" H; [# L0 g+ A
" I/ l& m; M# q& ^4 s#提取当前日期 5 E3 O  a8 k4 D3 n3 q* n+ r2 E
today=`date -d "0 day" +%Y年%m月%d日` * a$ t' _  b) p  Q
( B7 i( ?2 ^! `: Z5 s
#发送系统负载监控结果邮件 8 v# I$ N; w. x: x0 P' R! q) H
echo "这是$IP服务器$today的系统负载监控报告,请下载附件。" | mutt -s "$IP服务器$today的系统负载监控报告" -a /scripts/load_day.txt  fuquanjun@xxx.com
6 Y" `+ J6 V, H- E1 K; m. h  B$ x# chmod a+x /scripts/sendmail-load.sh
# z. V" f! L6 \2 b3 }7、编写系统负载监控的脚本文件:
8 Y  c9 R% O( k6 S2 ?, G复制代码代码如下:
5 d+ l0 {( t* q" M: k1 f
: q  o. k/ _6 ~( R# vim /scripts/load-warning.sh
9 R8 H0 P3 g6 K# ^+ Q#!/bin/bash 3 e; Y: H/ l7 w# y- V8 t
#使用uptime命令监控linux系统负载变化
. j, [2 i6 ?* e# R! d  a+ f6 v; ]
9 h7 R6 L& k7 k( t6 j#提取本服务器的IP地址信息
; o; x9 {. O7 l1 o9 M3 iIP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
/ P9 v7 w" H  i
' o5 u- K* h/ b: t6 k6 ^/ q$ D#抓取cpu的总核数
+ P" k# I- }' R$ ~4 q& L: |: a  {! Ycpu_num=`grep -c 'model name' /proc/cpuinfo` ' {3 W6 ^5 s7 i" {
" R7 H4 x1 y2 g
#抓取当前系统15分钟的平均负载值 0 S* u. d  ~/ n' m
load_15=`uptime | awk '{print $NF}'`
6 d" r  D0 B; P 7 I+ K3 t9 j+ Q) v
#计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。
+ ^: Q2 T* r) Q) faverage_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc` " `1 {, O: B, H. v

( Z4 l+ ~! |" A" z  m. |5 }. A#取上面平均负载值的个位整数 * _2 v0 j0 f. B4 T. E, t$ t! j) z3 g
average_int=`echo $average_load | cut -f 1 -d "."` & k3 n. o5 H' I% Z9 B

$ S: H5 I9 K# Q( X#设置系统单个核心15分钟的平均负载的告警值为0.70(即使用超过70%的时候告警)。 " ]. g& d1 s  _5 c8 g
load_warn=0.70 ) ~, ]# }8 `3 n8 Q# B2 ^
, b3 K  ~* p, v+ \
#当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0) ,直接发邮件告警;如果小于1.0则进行二次比较 9 a; L& R5 U; m6 f3 D; H
if (($average_int > 0)); then ' @: X+ d1 E" v/ d  x" e
      echo "$IP服务器15分钟的系统平均负载为$average_load,超过警戒值1.0,请立即处理!!!" | mutt -s "$IP 服务器系统负载严重告警!!!"  fuquanjun@xxx.com
. F6 e6 x# S. z7 s$ melse 7 ~; M" {* P0 c/ ]; O
#当前系统15分钟平均负载值与告警值进行比较(当大于告警值0.70时会返回1,小于时会返回0 )
0 f, G: Q5 K/ ^) |: ^! y6 u, {load_now=`expr $average_load \> $load_warn`
% t  I) P' J# ` * Z3 w) T3 [& x7 M
#如果系统单个核心15分钟的平均负载值大于告警值0.70(返回值为1),则发邮件给管理员
0 R  Y0 Y# ]- Q/ o if (($load_now == 1)); then ' I% j5 d6 U+ {, T$ s" {) b/ {
    echo "$IP服务器15分钟的系统平均负载达到 $average_load,超过警戒值0.70,请及时处理。" | mutt -s "$IP 服务器系统负载告警"  fuquanjun@xxx.com + V8 }! d3 U6 {6 Y3 A8 L9 R
fi 0 i, s* e0 u# B$ G' t: t, o" M
fi
2 H- i; s1 c) q0 R  g # chmod a+x /scripts/load-warning.sh& _; d* C- K* ]8 J5 K9 [/ c
三、监控服务器系统cpu占用情况:
8 f" I1 a! x4 M- S" y$ E) i$ L( n5 Q2 W0 N) d) S9 I. m" R
1、使用top命令查看linux系统cpu使用情况:0 `5 K  L! q5 @
复制代码代码如下:# m# M0 `, J7 c

1 Z6 G$ T9 c# j  ?$ i- L* Y3 [#  top -b -n 1 | grep Cpu   (-b -n 1 表只需要1次的输出结果)
3 R+ `  |( }6 \     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' A' T( k' O; t' e! `/ X

! ]2 s% e' L& ^* g- A7 z0 D1 T2、查看截取空闲cpu的百分比数值命令(只取整数部分):/ p+ f! T% l$ J5 O
复制代码代码如下:$ n4 n) S  _+ Y6 \1 D2 V' s  k0 W4 m
; R8 [6 |6 x  ^5 {
# top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."
1 P* \2 Q; N0 t6 J/ n& U( v- ^, J8 F0 q) G& f. {5 e: O. V
3、编写cpu监控的脚本文件:2 b4 }1 s0 ^$ T+ H8 l: V/ x, E
复制代码代码如下:
6 d, J7 M  i* I  J! O/ P* V! B' i2 q- v
# vim /scripts/cpu-check.sh
8 b! n) e/ a8 G+ K#!/bin/bash : J6 W- }8 `. Y: G) A8 j* e/ G4 j
#使用top命令监控linux系统cpu变化
; }9 C& e$ c0 v5 G
  l* [+ R8 O; N, x+ b#取系统当前时间(以追加的方式写入文件>>) / j: p" [" G5 c' R
date >> /scripts/datetime-cpu.txt    $ H3 P0 I1 f$ a
3 l! f. E) ]; w# Q
#抓取当前cpu的值(以追加的方式写入文件>>) , M6 R5 d) G) T! V
top -b -n 1 | grep Cpu  >> /scripts/cpu-now.txt  
8 W4 K5 i+ t+ q1 n! o3 r8 q8 l/ b* p
; J2 v% v' C% ^4 k( I: y#逐行连接上面的时间和cpu相关行数据(每次重新写入文件>)
: g: R/ x1 V" S; [/ ~3 T0 ~! ^paste  /scripts/datetime-cpu.txt   /scripts/cpu-now.txt  > /scripts/cpu.txt
  O7 z+ }6 `; k- Z) [  y# chmod a+x /scripts/cpu-check.sh
; b) ~2 ]' k/ ]; L% V# O4、查看CPU监控的结果文件:
4 Y9 n' _! g; {9 M; _$ Z复制代码代码如下:3 }  V- B- Y4 b; z& ]8 z

8 e: x' v8 \  X" I& p# cat /scripts/cpu.txt( |9 g, _. d- k

$ P" e+ D: a7 i% R0 P5、编写cpu结果文件邮件发送脚本:& {6 l- d9 [9 k6 Y, u
复制代码代码如下:
7 A' I. G' V0 ^# M- w$ _3 s+ S8 K2 n( d7 }9 t
# vim /scripts/sendmail-cpu.sh8 W) L+ }' |8 y$ x
#!/bin/bash 7 g& _$ S" r- J% s2 O; A1 i: `
#把生成的cpu.txt文件通过邮件发送给用户
2 m* ?% A+ n6 r* M" i: q
: I  b8 \1 `6 H% A9 S3 [#提取本服务器的IP地址信息 $ m0 v* Q# y, R/ w! {& B, G' r
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` + O  U3 _. H/ r( s5 ]
6 J8 [3 l3 T- W
#提取当前日期/ y, b( d0 R0 C/ M* @8 o: [
today=`date -d "0 day" +%Y年%m月%d日` , h4 @9 }; q  l
2 n1 H) |4 u; c4 K
#发送cpu监控结果邮件
9 [; r/ `+ e0 @8 d1 N; M9 Vecho "这是$IP服务器$today的cpu监控报告,请下载附件。" | mutt -s "$IP服务器$today的CPU监控报告" -a /scripts/cpu.txt  fuquanjun@xxx.com' B% |0 k  u& t$ h
# chmod a+x /scripts/sendmail-cpu.sh
  q2 h( ^% H) N5 s3 z* C  J( c 9 K" s. ]" w1 q! o) U0 y9 ~4 t+ `, K
四、监控系统cpu的情况,当使用超过80%的时候发告警邮件:
. Q2 [8 a) x  v5 Q+ L7 R6 M3 |" b+ N+ k1 Q0 {. n1 l$ W
复制代码代码如下:
. w" S* c, u3 f9 [
5 _7 a' z; d2 e  I$ K$ l; p' W, [! `# vim /scripts/cpu-warning.sh
, s% y. k6 V6 C0 ~/ v; d/ _& ?#!/bin/bash ) w* o! I$ x' h0 H
#监控系统cpu的情况脚本程序
* c: n2 U- T/ l+ X) e " @0 D% `2 ^. [0 O
#提取本服务器的IP地址信息
* W, ^- h: d7 `# p- N; i6 u& }( ~IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` : V) U; r9 P0 ?
4 V& y# h7 M6 o) j6 d. {
#取当前空闲cpu百份比值(只取整数部分)
3 t- S; W5 c0 i: r( I' \# B) Bcpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."`
: X2 y  [/ z2 J' t, D3 _3 C 3 Z% M' N) X$ g# Z, _: k, @9 d
#设置空闲cpu的告警值为20%,如果当前cpu使用超过80%(即剩余小于20%),立即发邮件告警
' @0 v( Y  v  ~  ]  Z8 Fif (($cpu_idle < 20)); then
1 Y, h% q  M7 G$ `      echo "$IP服务器cpu剩余$cpu_idle%,使用率已经超过80%,请及时处理。" | mutt -s "$IP 服务器CPU告警"  fuquanjun@xxx.com
8 n& k' Q6 E: b% o8 ~fi
9 F2 I$ x2 t8 w) `: h. B/ \8 f# 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使用率。
' s9 o, R' Q; S
( X$ q5 b$ ?  w4 r
#!/bin/bash
: p& P7 Z) l( j7 q8 b9 J
( ?5 M# s. F  E6 U0 m6 [( foutput=$(timeout 60.1 pidstat 60 -p ALL)
, C2 S2 ~$ Y8 i7 `) m
% m. E0 A3 Q0 c. C! |IFS='; G2 T& \2 x. _6 J; y5 a3 A

, H! r( m' X. X" q5 l2 c- A'6 v8 K, g( v/ [2 a- `, C

2 F  t' A2 A1 A" r% x5 v! X) mfor line in $output; do( w: V9 q6 W" w- u2 s9 w4 T2 Y

7 R6 |6 W8 W( Y' `& h/ ~& \$ E    # extract N-th column with awk' K6 e: t8 A5 u$ Y. c8 A' b
% B6 {) c& _2 _/ c1 t. c
    pid=`echo $line | awk '{ print $4}'`    # PID8 _7 ~3 |2 T" v3 ]: W- n1 {! E

* K3 Z" d& D8 y3 C  E* L! e2 |    pcpu=`echo $line | awk '{ print $9}'`   # percentage CPU
3 K+ ]9 C4 F$ ~
8 c+ b/ b3 f7 t7 ^4 @8 M    cpu=`echo $line | awk '{ print $10}'`   # CPU ID
6 t8 v2 [6 B8 g$ J! V* N$ h* t6 y4 X) b1 a' I2 X5 q4 E
    cmd=`echo $line | awk '{ print $11}'`   # command& c" Z; E& H, ~

; a' i( }) ?/ G* |& r    echo "$pid $pcpu $cpu $cmd"/ A4 d. z' {) [3 A* h+ R" y3 W" A
, c( i$ Y- @" I& @9 W
done

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-16 22:42:49 | 显示全部楼层
$ top -bn1 | grep load | awk '{printf "%.2f%%\t\t\n", $(NF-2)}'4 C8 R2 H6 q) X3 S1 |
1.30%               
+ h% v# o  f2 q0 l7 c# `( o0 A6 M0.10%                5 G8 X7 n- O8 y* y, b3 ]
0.00%               
+ h+ a. f' R, A
! V$ d! B) \- B- x* T6 v$ top -bn1 | grep load 6 M/ C$ _0 {: w$ v. l" V
top - 22:41:46 up 23:08,  2 users,  load average: 1.30, 1.28, 1.34
5 Z0 D3 ^6 R9 l# M7 o0 n  2089 root      20   0  385436  14672   9064 S   0.0  0.1   0:05.97 lloader
! l) L6 o  x! \2 _. l* h: c  2090 root      20   0   81668   3904   2936 S   0.0  0.0   0:01.08 lloader! I+ s3 J6 P& `- s6 ^: o/ [3 ^, v" c, e

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-11-10 16:26:47 | 显示全部楼层
# vim /scripts/load-warning.sh. e; A  i% b9 j- S, X, P
#!/bin/bash
' g* t0 C  X5 U" N$ P: x#使用uptime命令监控linux系统负载变化
( a6 d- e! _: I5 d; m6 @2 N3 ^  t' E$ R2 r: |
#提取本服务器的IP地址信息 6 T- X9 H! f% P1 f" q. \( Q* H) ~
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
) ?: b1 k3 s- ]. E7 f( q% e& b1 S) b2 ]/ n# M6 E- k
#抓取cpu的总核数 5 ]& O& A2 [' t  S- h
cpu_num=`grep -c 'model name' /proc/cpuinfo`
6 v. D- Z) ?" a) i) M* u
! _$ u5 R$ y# r; ~2 Y. g( L#抓取当前系统15分钟的平均负载值
, ^4 a& v: J! m: e. r- s* |4 {load_15=`uptime | awk '{print $NF}'`
/ }' c, `+ W7 e+ j. m% V6 L# G) {+ Y# r3 ?; q2 d9 z4 X
#计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。 5 Q$ n7 f* X$ ~# B, @9 }' \
average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc`
. }" Y4 r- D2 B  u  `2 {
1 f# o+ k3 F0 L" |% l' u4 O#取上面平均负载值的个位整数
! s; F9 |; c& R. H& r& D5 ]( g/ \average_int=`echo $average_load | cut -f 1 -d "."` 1 e9 s3 y- m9 K4 X1 X
, x8 X, P/ X& z1 [( }
#设置系统单个核心15分钟的平均负载的告警值为0.70(即使用超过70%的时候告警)。 ' Y% r; D' f5 \: ^7 Y/ r1 L4 f
load_warn=0.70
6 T- L7 V) E3 l5 K( ^5 e( P( s9 G- m$ \# Z4 R' O8 ?% A, V7 ]; q
#当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0) ,直接发邮件告警;如果小于1.0则进行二次比较
2 Z; y/ r5 R- ]7 Sif (($average_int > 0)); then
8 c, O# {% T5 C6 \5 I  echo "$IP服务器15分钟的系统平均负载为$average_load,超过警戒值1.0,请立即处理!!!" | mutt -s "$IP 服务器系统负载严重告警!!!" fuquanjun@xxx.com
2 G1 B- L7 I. g  else
7 L- @1 q1 m5 Z* E#当前系统15分钟平均负载值与告警值进行比较(当大于告警值0.70时会返回1,小于时会返回0 )
) e( e! G8 s( r' S& n0 Yload_now=`expr $average_load \> $load_warn` ) M* N& K* W: M/ ]$ `- o; f

+ C+ ?2 }; x. S% L: G( l#如果系统单个核心15分钟的平均负载值大于告警值0.70(返回值为1),则发邮件给管理员
5 s7 j6 |6 j0 _" {9 v  if (($load_now == 1)); then ; c  l& s0 S" r7 H% H
    echo "$IP服务器15分钟的系统平均负载达到 $average_load,超过警戒值0.70,请及时处理。" | mutt -s "$IP 服务器系统负载告警" fuquanjun@xxx.com; W; F# |- I, w
  fi
+ j  w5 e, w4 b/ ~# Hfi
/ Z1 K8 I6 J: ^+ y# X# chmod a+x /scripts/load-warning.sh
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 01:52 , Processed in 0.019101 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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