Linux CPU占用率原理与
精确度分析
<
1CPU占用率计算原理
1.1相关概念
在Linux/Unix下,CPU利用率分为用户态、系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。
下面是几个与CPU占用率相关的概念。
种子的拼音怎么写>护肤品的使用步骤⏹CPU利用率
CPU的使用情况。
⏹用户时间(Ur time)
表示CPU执行用户进程的时间,包括nices时间。通常期望用户空间CPU越高越好。
应急疏散
⏹系统时间(System time)
表示CPU在内核运行时间,包括IRQ和softirq时间。系统CPU占用率高,表明系统某部分存在瓶颈。通常值越低越好。
⏹等待时间(Waiting time)
CPI在等待I/O操作完成所花费的时间。系统部应该花费大量时间来等待I/O操作,否则就说明I/O存在瓶颈。
⏹空闲时间(Idle time)
系统处于空闲期,等待进程运行。
⏹Nice时间(Nice time)
系统调整进程优先级所花费的时间。
⏹硬中断处理时间(Hard Irq time)
系统处理硬中断所花费的时间。
⏹软中断处理时间(SoftIrq time)
系统处理软中断中断所花费的时间。
⏹丢失时间(Steal time)
被强制等待(involuntary wait)虚拟CPU的时间,此时hypervisor在为另一个虚拟处理器服务。
下面是我们在top命令看到的CPU占用率信息及各项值含义。
Cpu(s): 0.2%us, 0.2%sy, 0.0%ni, 99.2%id, 0.5%wa, 0.0%hi, 0.0%si, 0.0%st
来大姨妈有血块是怎么回事
us: Ur time
sy: System time
ni: Nice time
id: Idle time
wa: Waiting time
hi: Hard Irq time
si: SoftIrq time
st: Steal time
1.2CPU占用率计算
Linux CPU占用率计算,都是根据/proc/stat文件内容计算而来,下面是stat 文件内容样例,内核版本不同,会稍有不同,但内容基本一致。
CPU信息,cpu为总的信息,cpu0 … cpun为各个具体CPU信息
cpu 661733 468 503925 233055573 548835 14244 15849 0
上面共有8个值(单位:ticks),分别为:
Ur time,661733 Nice time, 468
System time, 503925 Idle time,233055573
Waiting time,548835 Hard Irq time, 14244
SoftIRQ time,15849 Steal time,0
CPU占用率计算公式如下:
领悟的拼音CPU时间=ur+system+nice+idle+iowait+irq+softirq+Stl
%us=(Ur time + Nice time)/CPU时间*100%
%sy=(System time + Hard Irq time +SoftIRQ time)/CPU时间*100%
%id=(Idle time)/CPU时间*100%
%ni=(Nice time)/CPU时间*100%
%wa=(Waiting time)/CPU时间*100%
%hi=(Hard Irq time)/CPU时间*100%
%si=(SoftIRQ time)/CPU时间*100%
%st=(Steal time)/CPU时间*100%
杨氏2CPU占用率内核实现
下面以RHEL6内核源码版本2.6.32-220.el6 x86_64为例,来介绍内核源码实现。/proc/stat文件的创建由函数proc_stat_init()实现,在文件fs/proc/stat.c中,在内核初始化时调用。/proc/stat文件相关函数时间均在stat.c文件中。
对/proc/stat文件的读写方法为proc_stat_operations。
00152: static const struct file_operations proc_stat_operations = {
stat_open,
00153: .open =
q_read,
00154: .read =
不二法门是什么意思
q_lek,
00155: .llek =
00156: .relea = single_relea,
00157: };
00158:
打开文件函数stat_open(),函数首先申请大小为size的内存,来存放临时数据(也是我们看到的stat里的最终数据)。
00128: static int s t a t_o p e n(struct inode *inode, struct file *file) 00129: {
00130: unsigned size = 4096 * (1 + num_possible_cpus() / 32); 00131: char *buf;
00132: struct q_file *m;
00133: int res;
00134:专业卡
00135: / * don't ask for more than the kmalloc() max size, currently 128 KB */