蓝盟IT外包,谈Top命令的CPU使用率

发布者:上海IT外包来源:http://www.lanmon.net点击数:1404

蓝盟IT小贴士,来喽!
让我解释一下这些CPU使用率的含义。
us  :包括用户时间、CPU执行用户进程的时间、nice时间。 用户空间的CPU通常希望越高越好。
sy:system  time,表示CPU在内核中执行的时间。 包括IRQ和软件。 系统的CPU使用率越高,表示系统的一部分存在瓶颈。 通常,这个值越低越好。
(Ni  ) nicetime,运行具有优先级的用户进程时占用的CPU利用率的百分比。
id:idle  time,表示系统处于空闲状态,正在等待进程执行。
wa  :等待时间表示处理器等待I/o操作完成的时间。 系统不应该花太多时间等待I/o操作。 否则,I/o将会遇到瓶颈。
hi:hard  IRQ  time表示系统处理硬盘中断所需的时间。
si  ) softirqtime表示系统处理软崩溃所用的时间。
st:steal  time,虚拟CPU的时间被强制等待。 此时,管理程序正在向其他虚拟处理器提供服务。
当然,光靠上面的说明很难理解意思。 因此,本论文主要从源代码的角度分析它们代表着什么。
时钟中断
首先,需要知道统计CPU的使用情况是在哪里执行的。 在分析之前,让我们先了解一下表坏了。
时钟中断:一种硬件中断,源于时间硬件(系统计时器、可编程硬件)。 CPU接收到时钟中断信号后,在处理当前指令后,调用时钟中断处理程序,完成系统时间更新、周期性任务的执行等。
可以看到,时钟中断处理程序进行了CPU利用率统计。
每个CPU的使用情况由cpu_usage_stat结构进行记录。 让我们来看看它的定义。
结构处理器使用状态
CPU时间64用户;
中央处理器时间64;
CPU时间64系统;
CPU时间64软件;
中央处理器时间64 _ t  IRQ;
CPU时间64空闲;中央处理器时间64;
CPU时间64 _ t状态;
CPU时间64 _ t访客;
(;
如cpu_usage_stat结构的定义所示,每个字段都与top命令的CPU利用率类型一一对应。 在内核初始化期间,将为每个CPU创建一个cpu_usage_stat结构,以统计CPU的利用率。
OK,这里分析一下内核是如何统计CPU使用情况的。
因为每次运行时钟中断处理程序时都会调用account_process_tick函数来统计CPU利用率,所以让我们来分析一下account_process_tick函数的实现。
声音帐户_处理_技巧(结构任务* p,内部用户技巧)。
{
CPU时间_吨_杰夫_缩放=CPU时间_到_缩放(CPU时间_一个_杰夫);
结构rq  * rq=this  _ rq  (;
//说明: user_tick变量标识用户是否为当前正在执行的用户APP应用程序
if  (用户技巧) {
//1 .如果CPU正在运行用户程序,则调用account_user_time进行统计
帐户_用户_时间(一次处理、一次处理、一次处理、缩放);
}elseif  () (p!=比=RQ-idle大(|(IRQ_count  )!=硬件偏移) {
//2 .如果CPU正在执行内核代码,则调用account_system_time进行统计
帐户_系统_时间(p,硬件IRQ  _偏移,处理器时间_一个_杰夫,
已缩放;} else  {
//3 .否则,表示CPU正在运行idle进程,即处于空闲状态,调用account_idle_time进行统计
帐户_空闲_时间(处理器时间_一个_杰夫);
}
}
account_process_tick函数主要分三种情况进行统计,如下所示。
如果CPU正在运行用户程序,则通过调用account_user_time进行统计。
如果CPU正在执行内核代码,则调用account_system_time进行统计。
否则,它表示CPU正在运行idle进程,即处于空闲状态,并调用account_idle_time进行统计。
CPU使用率统计
让我们分别分析这三类统计数据。
1 .统计用户程序的执行时间
统计用户程序的执行时间由account_user_time函数完成。 让我们看看它的实现。
void帐户_用户_时间(结构任务_结构* p,处理器时间_处理器时间,
CPU时间_ t  CPU时间_缩放)
{
获取//CPU的统计结构(每个CPU一个cpu_usage_stat结构) ) )。
结构处理器_使用状态*计算机=计算机/计算机;
中央处理器时间64;
.
//CPU的使用情况分为两种情况进行统计
//1 .如果进程的nice值大于0,则合计到nice字段中
//2 .如果进程的nice值小于等于0,则合计到user字段中
if(task_nice(p  )大于0 ) ) ) ) ) ) ) ) ) )。
大于cpustat-nice=CPU时间64 _添加(大于cpustat-nice,简称tmp  );
else
大于custat  -用户=CPU时间64 _添加(大于custat  -用户,称为tmp  );.
}
account_user_time函数主要分为两种情况统计。
如果进程的nice值大于0,则会将其添加到CPU统计结构的nice字段中。
如果进程的nice值小于等于0,则会将其添加到CPU统计结构的user字段中。
下面介绍进程nice值的作用。 nice的值越大,表示进程的优先级越低。 因此,nice统计主要用于统计优先级较低的进程的CPU利用率。 另外,还说明了user和nice的统计值全部属于执行用户程序的CPU时间。
2 .统计内核代码的执行时间
如果CPU在发生时钟中断之前处于内核状态,即内核代码正在运行。 调用account_system_time函数进行统计。 account_system_time函数的实现方式如下:
声音帐户_系统_时间(结构任务_结构* p,内部硬件IRQ  _偏移,
处理时间_处理时间,处理时间_处理时间_缩放)
{
获取//CPU的统计结构(每个CPU一个cpu_usage_stat结构) ) )。
结构处理器_使用状态*计算机=计算机/计算机;
中央处理器时间64;
.
//主要分三种情况进行统计
//1 .在当前处于硬中断执行上下文的情况下,合计到irq字段
//2 .当前处于软件击穿执行上下文的情况下,合计到softirq字段
//3 .否则统计到system字段
if  (硬件IRQ  _计数(-硬件IRQ  _偏移() ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )。
大于cpustat-IRQ=CPU时间64 _添加(大于cpustat-IRQ,为tmp  );
else  if  (软件计数) )
大于cpustat-softirq=CPU时间64 _添加(大于custat-softirq,简称为tmp  );else
大于计算机系统=计算机时间64 _添加(大于计算机系统,tmp  );
.
}
帐户_系统_时间函数主要分为三种情况进行统计:
如果当前处于硬中断执行上下文,则将其添加到CPU统计结构的irq字段中。
如果当前位于软件细分执行上下文中,则将其添加到CPU统计结构的softirq字段中。
否则,将其添加到CPU统计结构的系统字段中。
从上面的代码可以看到,irq和softirq的统计值也是内核代码的执行时间。
3. idle进程的运行时间统计
如果系统中没有可执行的进程,则会运行idle进程。 这意味着,当系统正在运行idle进程时,系统将处于空闲状态。
文/上海蓝盟   IT外包专家
IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部