您的位置:首页 > 运维架构 > Linux

Linux平台Cpu使用率的计算

2011-01-20 17:47 435 查看

proc
文件系统

/proc
文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过
/proc
得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取
/proc
目录中的文件时,
proc
文件系统是动态从系统内核读出所需信息并提交的。

/proc
目录中有一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程在
/proc
下都对应一个以进程号为目录名的目录
/proc/pid
,它们是读取进程信息的接口。此外,在

Linux
2.6.0-test6
以上的版本

/proc/pid
目录中有一个
task
目录,
/proc/pid/task
目录中也有一些以该进程所拥有的线程的线程号命名的目录
/proc/pid/task/tid
,它们是读取线程信息的接口。

/proc/cpuinfo
文件

该文件中存放了有关
cpu
的相关信息
(
型号,缓存大小等
)


[zhengangen@buick ~]$ cat /proc/cpuinfo

processor
: 0

vendor_id
: GenuineIntel

cpu family
: 15

model
: 4

model name
: Intel(R)
Xeon(TM) CPU 3.00GHz

stepping
: 10

cpu MHz
: 3001.177

cache size
: 2048 KB

physical id
: 0

siblings
: 2

core id
: 0

cpu cores
: 1

fdiv_bug
: no

hlt_bug
: no

f00f_bug
: no

coma_bug
: no

fpu
: yes

fpu_exception
: yes

cpuid level
: 5

wp
: yes

flags
: fpu vme de pse
tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr
sse sse2 ss ht tm pbe lm pni monitor ds_cpl cid xtpr

bogomips
: 6004.52

说明:

以下只解释对我们计算
Cpu
使用率有用的相关参数。

参数

解释

processor
(0)
cpu
的一个物理标识

结论
1

:可以通过该文件根据
processor
出现的次数统计
cpu
的逻辑个数
(
包括多核、超线程
)


/proc/stat
文件

该文件包含了所有
CPU
活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。不同内核版本中该文件的格式可能不大一致,以下通过实例来说明数据该文件中各字段的含义。

实例数据:
2.6.24-24
版本上的

fjzag@fjzag-desktop:~$
cat /proc/stat

cpu
38082 627 27594 893908
12256 581 895 0 0

cpu0
22880 472 16855 430287 10617 576 661 0 0

cpu1
15202 154 10739 463620 1639 4 234 0 0

intr
120053 222 2686 0 1 1 0 5 0 3 0 0 0 47302 0 0 34194 29775 0 5019 845 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

ctxt
1434984

btime
1252028243

processes
8113

procs_running
1

procs_blocked
0

第一行的数值表示的是CPU
总的使用情况,所以我们只要用第一行的数字计算就可以了。下表解析第一行各数值的含义:

参数

解析(单位:jiffies



(
jiffies
是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在
linux
中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同
linux
内核可能值有不同,通常在
1ms

10ms
之间
)

user

(
38082
)

从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice
值为负进程。

nice

(
627
)

从系统启动开始累计到当前时刻,nice
值为负的进程所占用的CPU
时间

system

(
27594
)

从系统启动开始累计到当前时刻,处于核心态的运行时间

idle

(
893908
)

从系统启动开始累计到当前时刻,除IO
等待时间以外的其它等待时间iowait

(

12256
)

从系统启动开始累计到当前时刻,IO
等待时间(

since 2.5.41
)

irq

(
581
)

从系统启动开始累计到当前时刻,硬中断时间(

since 2.6.0-test4
)

softirq

(
895
)

从系统启动开始累计到当前时刻,软中断时间(

since
2.6.0-test4
)
stealstolen

(0
)

which is the time spent in other
operating systems when running in a virtualized environment(since 2.6.11
)

guest

(0
)
which
is the time spent running a virtual

CPU
for
guest operating systems under the control of
the Linux kernel(since 2.6.24
)

结论
2

:总的
cpu
时间
totalCpuTime = user + nice
+ system + idle + iowait + irq + softirq
+ stealstolen

+
guest

/proc/<pid>/stat
文件

该文件包含了某一进程所有的活动的信息,该文件中的所有值都是从系统启动开始累计

到当前时刻。以下通过实例数据来说明该文件中各字段的含义。

[zhengangen@buick ~]# cat
/proc/6873/stat

6873
(a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31
0 0
25 0 3 0
5882654 1409024 56 4294967295 134512640 134513720 3215579040 0 2097798 0 0 0 0
0 0 0 17 0 0 0

说明:

以下只解释对我们计算
Cpu
使用率有用相关参数

参数

解释

pid=6873

进程号

utime=1587

该任务在用户态运行的时间,单位为
jiffies

stime=41958

该任务在核心态运行的时间,单位为
jiffies

cutime=0

所有已死线程在用户态运行的时间,单位为
jiffies

cstime=0

所有已死在核心态运行的时间,单位为
jiffies

结论
3



进程的总
Cpu
时间
processCpuTime = utime +
stime + cutime + cstime
,该值包括其所有线程的
cpu
时间。

/proc/<pid>/task/<tid>/stat
文件

该文件包含了某一进程所有的活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。该文件的内容格式以及各字段的含义同
/proc/<pid>/stat
文件。

注意,该文件中的
tid
字段表示的不再是进程号,而是
linux
中的轻量级进程
(lwp)
,即我们通常所说的线程。

结论
4

:线程
Cpu
时间
threadCpuTime = utime +
stime

系统中有关进程
cpu
使用率的常用命令

ps
命令

通过
ps
命令可以查看系统中相关进程的
Cpu
使用率的信息。以下在
linux man
文档中对
ps
命令输出中有关
cpu
使用率的解释:

CPU usage is currently
expressed as the percentage of time spent running during the entire lifetime of
a process. This is not ideal, and it does not conform to the standards that ps
otherwise conforms to. CPU usage is unlikely to add up to exactly 100%.

%cpu
cpu utilization of the process in
"##.#" format. It is the CPU time used
divided by the time
the process has been running (cputime/realtime ratio),
expressed as a
percentage. It will not add up to 100% unless you are lucky.

结论
5



ps
命令算出来的
cpu
使用率相对于进程启动时的平均值,随着进程运行时间的增大,该值会趋向于平缓。

top
命令

通过
top
命令可以查看系统中相关进程的实时信息(
cpu
使用率等)。以下是
man
文档中对
top
命令输出中有关进程
cpu
使用率的解释。

#C
--

Last used CPU (SMP)
A
number representing the last used processor. In a true
SMP

environment
this
will

likely change
frequently
since

the
kernel intentionally uses
weak affinity.
Also, the very act of
running top may break this weak affinity and cause more processes to
change

CPUs
more
often (because of the extra demand for cpu
time).

%CPU
--
CPU
usage

The
task’s share of
the elapsed CPU time since the last screen update, expressed as a percent-age
of total CPU time.
In a true SMP environment, if
Irix mode is Off, top will operate in Solaris mode
where a task’s cpu usage will be divided by the total number of CPUs.

结论
6



某一个线程在其运行期间其所使用的
cpu
可能会发生变化。

结论
7



在多核的情况下
top

命令输出的
cpu

使用率实质是按
cpu

个数
*100%

计算的。



单核情况下
Cpu
使用率的计算

基本思想

通过读取
/proc/stat

/proc/<pid>/stat

/proc/<pid>/task/<tid>/stat
以及
/proc/cpuinfo
这几个文件获取总的
Cpu
时间、进程的
Cpu
时间、线程的
Cpu
时间以及
Cpu
的个数的信息,然后通过一定的算法进行计算
(
采样两个足够短的时间间隔的
Cpu
快照与进程快照来计算进程的
Cpu
使用率
)


总的
Cpu
使用率计算

计算方法:

1、

采样两个足够短的时间间隔的
Cpu
快照,分别记作
t1,t2
,其中
t1

t2
的结构均为:

(user

nice

system

idle

iowait

irq

softirq

stealstolen

guest)

9
元组
;

2、

计算总的
Cpu
时间片
totalCpuTime

a)

把第一次的所有
cpu
使用情况求和,得到
s1;

b)

把第二次的所有
cpu
使用情况求和,得到
s2;

c)

s2 - s1
得到这个时间间隔内的所有时间片,即
totalCpuTime = j2 - j1 ;

3
、计算空闲时间
idle

idle
对应第四列的数据,用第二次的第四列
-
第一次的第四列即可

idle=
第二次的第四列
-
第一次的第四列

6
、计算
cpu
使用率

pcpu =100* (total-idle)/total

某一进程
Cpu
使用率的计算

计算方法:

1.

采样两个足够短的时间间隔的
cpu
快照与进程快照,

a)

每一个
cpu
快照均为
(user

nice

system

idle

iowait

irq

softirq

stealstolen

guest)

9
元组
;

b)

每一个进程快照均为
(utime

stime

cutime

cstime)

4
元组;

2.

分别根据结论

2

、结论
3

计算出两个时刻的总的
cpu
时间与进程的
cpu
时间,分别记作:
totalCpuTime1

totalCpuTime2

processCpuTime1

processCpuTime2

3.

计算该进程的
cpu
使用率
pcpu = 100*(
processCpuTime2 – processCpuTime1
) / (totalCpuTime2 – totalCpuTime1)
(

100%
计算,如果是多核情况下还需乘以
cpu
的个数
);

实验数据

实验一

:


监控一空循环的进程的
cpu
使用率。

说明:

左边的数据是按以上算法得到的数据,其中采样的时间间隔与
top
命令刷新屏幕的时间间隔相同。

按以上方法计算得到的
cpu
使用率

通过
top
命令得到的

99.50083

98.333336

98.0

98.83138

99.0

99.0

99.83361

98.83527

98.4975

PID
USER

PR

NI

VIRT

RES

SHR

S
%CPU

%MEM
TIME+
COMMAND

7639 fjzag
20
0

206m
10m 7136 S
99

2.2
1:00.74 java

7639 fjzag
20

0
206m
10m 7136 S

99
2.2
1:03.71 java

7639 fjzag
20

0
206m
10m 7136 S

99
2.2
1:06.67 java

7639 fjzag
20

0
206m
10m 7136 S

99
2.2
1:09.63 java

7639 fjzag
20

0
206m
10m 7136 S

98
2.2
1:12.59 java

7639 fjzag
20

0
206m
10m 7136 S

99
2.2
1:15.55 java

7639 fjzag
20

0
206m
10m 7136 S

100
2.2
1:18.55 java

7639 fjzag
20

0
206m
10m 7136 S

100
2.2
1:21.54 java

7639 fjzag

20
0

206m
10m 7136 S
99

2.2
1:24.52 java

7639 fjzag
20

0
206m
10m 7136 S

98
2.2
1:27.46 java

实验二

:


监控
jconsole
进程的
cpu
使用率。

说明:

左边的数据是按以上算法得到的数据,其中采样的时间间隔与
top
命令刷新屏幕的时间间隔相同。

按以上方法计算得到的
cpu
使用率

通过
top
命令得到的

8.681135

12.0

10.350584

7.6539097

7.6539097

5.0

13.021703

11.0

8.666667

PID
USER

PR

NI

VIRT

RES

SHR
S

%CPU

%MEM
TIME+

COMMAND

7753 fjzag
20
0

252m
72m
22m S

10 14.4
0:18.70 jconsole

7753 fjzag
20

0
252m
72m

22m S
12 14.4
0:19.07 jconsole

7753 fjzag
20

0
252m
72m

22m S
11 14.4
0:19.39 jconsole

7753 fjzag
20

0
252m
72m

22m S
7 14.4
0:19.61 jconsole

7753 fjzag

20
0

252m
72m
22m S

7 14.4
0:19.83 jconsole

7753 fjzag
20

0
252m
72m

22m S
5 14.4
0:19.97 jconsole

7753 fjzag
20

0
252m
72m

22m S
14 14.4
0:20.38 jconsole

7753 fjzag
20

0
252m
72m

22m S
10 14.4
0:20.68 jconsole

7753 fjzag
20

0
252m
72m

22m S
9 14.5
0:20.96 jconsole

某一线程
Cpu
使用率的计算

计算方法:

1.

采样两个足够短的时间隔的
cpu
快照与线程快照,

a)

每一个
cpu
快照均为
(user

nice

system

idle

iowait

irq

softirq

stealstealon

guest)

9
元组
;

b)

每一个线程快照均为
(utime

stime)

2
元组;

2.

分别根据结论

2

、结论
4

计算出两个时刻的总的
cpu
时间与线程的
cpu
时间,分别记作:
totalCpuTime1

totalCpuTime2

threadCpuTime1

threadCpuTime2

3.

计算该线程的
cpu
使用率
pcpu = 100*( threadCpuTime2
– threadCpuTime1
) / (totalCpuTime2
– totalCpuTime1)
(

100%
计算,如果是多核情况下还需乘以
cpu
的个数
);

实验数据

实验一

:


监控一空循环的线程的
cpu
使用率。

说明:

左边的数据是按以上算法得到的数据,其中采样的时间间隔与
top
命令刷新屏幕的时间间隔相同。

按以上方法计算得到的
cpu
使用率

通过
top
命令得到的

98.83138

97.00997

96.98997

97.49583

98.169716

96.8386

97.333336

93.82304

98.66667

PID
USER

PR

NI

VIRT

RES

SHR

S
%CPU

%MEM
TIME+
COMMAND

7649 fjzag
20
0

206m
10m 7136 R
97

2.2
7:22.94 java

7649 fjzag
20

0
206m
10m 7136 R

97
2.2
7:25.86 java

7649 fjzag
20

0
206m
10m 7136 R

97
2.2
7:28.76 java

7649 fjzag

20
0

206m
10m 7136 R
99

2.2
7:31.72 java

7649 fjzag
20

0
206m
10m 7136 R

98
2.2
7:34.65 java

7649 fjzag
20

0
206m
10m 7136 R

96
2.2
7:37.53 java

7649 fjzag
20

0
206m
10m 7136 R

98
2.2
7:40.47 java

7649 fjzag
20

0
206m
10m 7136 R

96
2.2
7:43.34 java

7649 fjzag
20

0
206m
10m 7136 R

97
2.2
7:46.25 java

实验二

:


监控
jconsole
程序某一线程的
cpu
使用率。

说明:

左边的数据是按以上算法得到的数据,其中采样的时间间隔与
top
命令刷新屏幕的时间间隔相同。

按以上方法计算得到的
cpu
使用率

通过
top
命令得到的

1.3400335

6.644518

1.3333334

0.6677796

0.6666667

1.3333334

1.3333334

PID
USER
PR

NI

VIRT

RES

SHR
S
%CPU

%MEM
TIME+
COMMAND

7755 fjzag
20
0

251m
72m
22m S

1 14.4
0:11.92 jconsole

7755 fjzag
20

0
251m
72m

22m S
7 14.4
0:12.12 jconsole

7755 fjzag
20

0
251m
72m

22m S
2 14.4
0:12.18 jconsole

7755 fjzag

20
0

251m
72m
22m S

0 14.4
0:12.18 jconsole

7755 fjzag
20

0
251m
72m

22m S
1 14.4
0:12.20 jconsole

7755 fjzag
20

0
251m
72m

22m S
1 14.4
0:12.24 jconsole

7755 fjzag
20

0
251m
72m

22m S
1 14.4
0:12.28 jconsole

多核情况下
cpu
使用率的计算

以下通过实验数据来说明
多核情况下某一进程
cpu
使用率是按
cpu
个数
*100%
计算的
.

实验一

描述
:


双核

的情况下作的一组实验,第一组数据是通过
ps
-eLo pid,lwp,pcpu | grep 9140
命令查看进程号为
9140
的进程中各线程的详细信息。第二组数据是通过
ps
命令查看进程号为
9140
进程的
cpu
使用率。

数据一:

pid
lwp
%cpu


9140 9140 0.0

9140 9141 0.0

9140 9142 0.0

9140 9143 0.0

9140 9144 0.0

9140 9149 0.0

9140 9150 0.0

9140 9151 0.0

9140 9152 0.1

9140 9153 96.6

该线程是一个空循环

9140 9154 95.9

该线程是一个空循环

以上除了红色标注出来的两个线程以外
,
其他的线程都是后台线程。

数据二:

pid
%cpu


9140 193

实验二

描述:


单核

的情况下作的一组实验,第一组数据是通过
ps
-eLo pid,lwp,pcpu | grep 6137
命令查看进程号为
6137
的进程中各线程的详细信息。第二组数据是通过
ps
命令查看进程号为
6137
进程的
cpu
使用率。

数据一:


pid
lwp

%cpu


6137

6137
0.0

6137

6138
0.1

6137

6143
0.0

6137

6144
0.0

6137

6145
0.0

6137

6146
0.0

6137

6147
0.0

6137

6148
0.0

6137

6149
0.0

6137

6150 46.9

空循环线程

6137

6151 46.9

空循环线程

以上除了红色标注出来的两个线程以外
,
其他的线程都是后台线程。

数据二

pid %cpu


6137 92.9

主要问题:

1.

不同内核版本
/proc/stat
文件格式不大一致。
/proc/stat
文件中第一行为总的
cpu
使用情况。

各个版本都有的
4
个字段
: user

nice

system

idle

2.5.41
版本新增字段:
iowait

2.6.0-test4
新增字段:
irq

softirq

2.6.11
新增字段:
stealstolen



which is the
time spent in other operating

systems when
running in a virtualized environment

2.6.24
新增字段:
guest:
which
is the time spent running a virtual

CPU
for
guest operating systems under the control of
the Linux kernel

2

/proc/pid/task
目录是
Linux 2.6.0-test6
之后才有的功能。

3
.关于出现
cpu
使用率为负的情况,目前想到的解决方案是如果出现负值,连续采样计算
cpu
使用率直到为非负。

4.

有些线程生命周期较短
,
可能在我们采样期间就已经死掉了
.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: