[monitor] 2. Linux CPU占用率的计算原理

来源:互联网 发布:c语言编写的代码程序 编辑:程序博客网 时间:2024/06/06 02:18

1、CPU占用率查看工具

Linux提供了多种工具,用来查看CPU占用率、内存使用情况等等。

1.1、top

top是linux下最常用的cpu占用率查看工具,他提供了查看每个CPU上所有进程总的占用率和单个进程占用率的功能。

1

us : user态的占用率,ni : nice为正的user态的占用率(低优先级),sy :system态占用率,wa :io等待占用率,hi:硬中断占用率,si:软中断占用率,id:空闲状态占用率,st:steal时间的占用率。

其中us+ni+sy+wa+hi+si+id等于cpu总的运行时间。

1.2、vmstat

vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,vmstat可以设置时间间隔,定时的打印出系统cpu占用率。

2

1.3、sysstat工具包(sar、pidstat、iostat、mpstat)

sysstat工具包提供了更多的系统性能监控工具,其中多个工具可以用来查询cpu占用率。

sar是System Activity Reporter(系统活跃情况报告)的缩写 :

3

mpstat是Multiprocessor Statistics的缩写:

4

pidstat可以显示单个进程或者所有进程的cpu占用率:

5

iostat也可以用来查看cpu占用率:

6

2、CPU占用率的计算原理

虽然查询cpu占用率的工具有很多种,原理上都是一样的,计算cpu上所有进程总的占用率的话依赖于“/proc/stat”文件,计算单个进程的占用率依赖于“/proc/pid/stat”文件。

2.1、CPU上所有进程总的占用率

2.1.1、/proc/stat

上面已经说过cpu上总的占用率依赖于“/proc/stat”文件,我们来看看“/proc/stat”文件中究竟包含了那些数据。

7

我们通过 “cat /proc/stat”命令可以查看其中的具体内容,其中cpu、cpu0、cpu1、cpu2、cpu3、cpu4这几行的的计数是用来计算cpu占用率的,每一行参数从前到后其含义如下:

user: (32262891) 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为正进程。1jiffies=0.01秒nice: (1024706) 从系统启动开始累计到当前时刻,nice值为正的用户态所占用的CPU时间(单位:jiffies)system: (39623936) 从系统启动开始累计到当前时刻,核心时间(单位:jiffies)idle: (429821288) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)iowait: (4593703) 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,irq: (309575) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)softirq: (2770009) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)steal: (0) 从系统启动开始累计到当前时刻,steal时间(单位:jiffies)CPU总时间=user+system+nice+idle+iowait+irq+softirq。

所以计算cpu总的占用率,只要用单个状态下的计数值除以cpu总时间就能计算出相应的占用率。

2.1.2、proc_misc_init()

分析内核代码fs/proc/proc_misc.c中“/proc/stat”文件的注册函数proc_misc_init(),看看其是怎么实现的。

8
9
10
11
12
13
14

从代码分析中我们可以看到“/proc/stat”的cpu占用率相关计数来源于每cpu变量“kstat”。

2.1.3、update_process_times()

我们继续追查每cpu变量“kstat”的数据来源。在系统的tick时钟中断处理函数中,一方面会调用时间片调度函数scheduler_tick(),还会调用一个更新计数值的函数update_process_times()。update_process_times()函数中就更新了每cpu变量“kstat”的相关字段。

15
16
17

从上述的代码分析来看每cpu变量“kstat”的字段来源于tick中断的采样,在定时产生的tick中断中判断中断前的一个状态,对其分别进行计数。分为“user”、“nice”、“irq”、“softirq”、“system”、“iowait” 、“idle”几种状态。

由此可见cpu占用率的计算原理就是tick采样。

2.2、单个进程的占用率

我们可以看到update_process_times()函数中不仅仅是更新了cpu变量“kstat”的字段,还更新了本进程的两个字段“utime”、“stime”,分别表示进程的用户态和内核态时间计数。

这两个字段用来计算单个进程的cpu占用率,通过“/proc/pid/stat”文件呈现出来。

2.2.1、/proc/pid/stat

“/proc/pid/stat”文件中有相关字段表明单个进程的用户态和内核态时间计数。

18

2.2.2、do_task_stat()

分析内核代码中“/proc/pid/stat”文件的读函数do_task_stat(),看看其是怎么实现的。

19
20
21
22
23
24
25
26

原创粉丝点击