下面我们看一下/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
$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
$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
\$2}' "/tmp/stat"`;
23.@NICE=`awk
\$3}' "/tmp/stat"`;
24.@SYSTEM=`awk
\$4}' "/tmp/stat"`;
25.@IDLE=`awk
\$5}' "/tmp/stat"`;
26.@IOWAIT=`awk
\$6}' "/tmp/stat"`;
27.@IRQ=`awk
\$7}' "/tmp/stat"`;
28.@SOFTIRQ=`awk
\$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