linux内核态全局变量导出proc,linux下根据/proc/stat计算CPU使用情况算法详解

下面我们看一下/proc/stat 的内容结构

01./bin/cat /proc/stat

02.cpu 3783155 5336 947214 78774537 115679 6

89497 0

03.cpu0 871159 806

194940 19851524 8176 0 2221 0

04.cpu1 918820 1900

203290 19794976 7834 1 1980 0

05.cpu2 922359 882

213789 19715943 61418 2 14503 0

06.cpu3 1070815 1747

335193 19412092 38250 1 70791 0

07.intr 284814153

209329067 3 0 0 4 0 0 0 1 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 252 0 0 0 0 0 0 0 2664133 0 0 0 0

0 0 0 72820689 0 0 0 0 0

08.ctxt

1591477835

09.btime

1268412588

10.processes

1346557

11.procs_running

1

12.procs_blocked

1

咋一看去相当的晕,完全不知从何下手。有关文件格式的介绍可以参考:http://www.linuxhowtos.org/System/procstat.htm

下面对输出信息做解释:

CPU时间=user+system+nice+idle+iowait+irq+softirq

“intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。

“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。

“btime”给出了从系统启动到现在为止的时间,单位为秒。

“processes (total_forks) 自系统启动以来所创建的任务的个数目。

“procs_running”:当前运行队列的任务的数目。

“procs_blocked”:当前被阻塞的任务的数目。

那么CPU利用率可以使用以下两个方法。先取两个采样点,然后计算其差值:

[code lang="code"]

cpu usage=(idle2-idle1)/(cpu2-cpu1)*100 cpu usage=[(user_2

+sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 -

total_1)*100

[/code]

以下用分别用bash和perl做的一个cpu利用率的计算:

原作者注:以下代码则采用公式为:

[code lang="code"]

total_0USER[0]+NICE[0]+SYSTEM[0]+IDLE[0]+IOWAIT[0]+IRQ[0]+SOFTIRQ[0]

total_1=USER[1]+NICE[1]+SYSTEM[1]+IDLE[1]+IOWAIT[1]+IRQ[1]+SOFTIRQ[1]

cpu usage=(IDLE[0]-IDLE[1]) / (total_0-total_1) * 100

[/code]

bash 代码:

01.#!/bin/sh

02.##echo user nice system idle iowait irq

softirq

03.CPULOG_1=$(cat /proc/stat |

grep

'cpu ' | awk '{print $2" "$3"

"$4" "$5"

"$6" "$7"

"$8}')

04.SYS_IDLE_1=$(echo $CPULOG_1 |

awk

'{print $4}')

05.Total_1=$(echo $CPULOG_1 |

awk

'{print

$1+$2+$3+$4+$5+$6+$7}')

06.

07.sleep 5

08.

09.CPULOG_2=$(cat /proc/stat |

grep

'cpu ' | awk '{print $2" "$3"

"$4" "$5"

"$6" "$7"

"$8}')

10.SYS_IDLE_2=$(echo $CPULOG_2 |

awk

'{print $4}')

11.Total_2=$(echo $CPULOG_2 |

awk

'{print

$1+$2+$3+$4+$5+$6+$7}')

12.

13.SYS_IDLE=`expr $SYS_IDLE_2 -

$SYS_IDLE_1`

14.

15.Total=`expr $Total_2 -

$Total_1`

16.SYS_USAGE=`expr $SYS_IDLE/$Total*100 |bc -l`

17.

18.SYS_Rate=`expr 100-$SYS_USAGE

|bc -l`

19.

20.Disp_SYS_Rate=`expr "scale=3; $SYS_Rate/1" |bc`

21.echo $Disp_SYS_Rate%

perl 代码:

01.#!/usr/bin/perl

02.use

warnings;

03.

04.$SLEEPTIME=5;

05.

06.if

(-e "/tmp/stat")

{

07.unlink "/tmp/stat";

08.}

09.open (JIFF_TMP,

">>/tmp/stat")

|| die "Can't open /proc/stat

file!\n";

10.open (JIFF,

"/proc/stat") ||

die "Can't open /proc/stat

file!\n";

11.@jiff_0=;

12.print JIFF_TMP

$jiff_0[0]

;

13.close (JIFF);

14.

15.sleep $SLEEPTIME;

16.

17.open (JIFF,

"/proc/stat") ||

die "Can't open /proc/stat

file!\n"; @jiff_1=;

18.print JIFF_TMP

$jiff_1[0];

19.close (JIFF);

20.close (JIFF_TMP);

21.

22.@USER=`awk

'{print

\$2}' "/tmp/stat"`;

23.@NICE=`awk

'{print

\$3}' "/tmp/stat"`;

24.@SYSTEM=`awk

'{print

\$4}' "/tmp/stat"`;

25.@IDLE=`awk

'{print

\$5}' "/tmp/stat"`;

26.@IOWAIT=`awk

'{print

\$6}' "/tmp/stat"`;

27.@IRQ=`awk

'{print

\$7}' "/tmp/stat"`;

28.@SOFTIRQ=`awk

'{print

\$8}' "/tmp/stat"`;

29.

30.$JIFF_0=$USER[0]+$NICE[0]+$SYSTEM[0]+$IDLE[0]+$IOWAIT[0]+$IRQ[0]+$SOFTIRQ[0];

31.$JIFF_1=$USER[1]+$NICE[1]+$SYSTEM[1]+$IDLE[1]+$IOWAIT[1]+$IRQ[1]+$SOFTIRQ[1];

32.$SYS_IDLE=($IDLE[0]-$IDLE[1]) /

($JIFF_0-$JIFF_1) *

100; $SYS_USAGE=100 -

$SYS_IDLE;

33.

34.printf ("The CPU

usage is %1.2f%%\n",$SYS_USAGE);

参考原文:http://server.51cto.com/sCollege-188250.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值