如何计算CPU使用率?

Chr*_*nte 69 algorithm cpu performance cpu-architecture cpu-usage

在我的桌面上,我有一个小小部件告诉我当前的CPU使用情况.它还显示了我的两个核心的使用情况.

我总是想知道,CPU如何计算其处理能力的使用量?此外,如果CPU挂起来进行一些强烈的计算,它怎么能(或任何处理此活动)检查使用情况,而不会挂断?

dav*_*ave 64

有一个称为空闲任务的特殊任务,在没有其他任务可以运行时运行.%使用率只是我们没有运行空闲任务的时间百分比.操作系统将保持运行空闲任务所花费的总时间:

  • 当我们切换到空闲任务时,设置t =当前时间
  • 当我们离开空闲任务时,将(当前时间 - t)添加到运行总计

如果我们将相隔n秒运行总计的两个样本,我们可以计算运行空闲任务所花费的n秒的百分比(第二个样本 - 第一个样本)/ n

请注意,这是操作系统所做的事情,而不是CPU.CPU级别不存在任务的概念!(实际上,空闲任务会使处理器使用HLT指令进入休眠状态,因此CPU确实知道它何时未被使用)

至于第二个问题,现代操作系统是先发制人的多任务,这意味着操作系统可以随时切换您的任务.操作系统如何实际窃取CPU远离您的任务?中断:http://en.wikipedia.org/wiki/Interrupt

  • ++优秀的答案.我还发现自己告诉人们程序正在运行或等待,并且分别使用100%或0%的核心.他们看到的"利用率百分比"只是一个短暂的平均值.你认为这很明显,但有时却不是. (10认同)

In *_*ico 30

CPU本身不进行使用计算.它可能具有硬件功能,使该任务更容易,但它主要是操作系统的工作.显然,实现的细节会有所不同(特别是在多核系统的情况下).

一般的想法是看看CPU需要做多长时间的事情.操作系统可以定期查看调度程序以确定它必须执行的操作的数量.

这是一个执行上述计算的Linux函数(从维基百科中删除):

#define FSHIFT   11  /* nr of bits of precision */
#define FIXED_1  (1<<FSHIFT) /* 1.0 as fixed-point */
#define LOAD_FREQ (5*HZ) /* 5 sec intervals */
#define EXP_1  1884  /* 1/exp(5sec/1min) as fixed-point */
#define EXP_5  2014  /* 1/exp(5sec/5min) */
#define EXP_15 2037  /* 1/exp(5sec/15min) */

#define CALC_LOAD(load,exp,n) \
    load *= exp; \
    load += n*(FIXED_1-exp); \
    load >>= FSHIFT;

unsigned long avenrun[3];

static inline void calc_load(unsigned long ticks)
{
    unsigned long active_tasks; /* fixed-point */
    static int count = LOAD_FREQ;

    count -= ticks;
    if (count < 0) {
        count += LOAD_FREQ;
        active_tasks = count_active_tasks();
        CALC_LOAD(avenrun[0], EXP_1, active_tasks);
        CALC_LOAD(avenrun[1], EXP_5, active_tasks);
        CALC_LOAD(avenrun[2], EXP_15, active_tasks);
    }
}
Run Code Online (Sandbox Code Playgroud)

至于问题的第二部分,大多数现代操作系统都是多任务的.这意味着操作系统不会让程序占用所有的处理时间而且没有任何处理时间(除非你做到这一点).换句话说,即使应用程序出现挂起,操作系统仍然可以为自己的工作偷走一些时间.

  • "CPU本身实际上并没有进行任何CPU使用计算." - 对处理器上的工作负载进行采样的OS代码在哪里执行?:) (2认同)
  • @Ani:好吧,没有代码,CPU 自己什么也做不了,不是吗?:-) 我的意思是没有操作码或机器指令可以告诉您 CPU 使用情况,AFAIK。 (2认同)
  • @Vatine:我将OP的问题解释为与CPU负载有关,因为问题提到了性能.如果CPU A有2个待处理任务,而CPU B有20个待处理任务(两者都执行相似的操作),则两者都可能使用100%的CPU时间,但CPU A的性能更好. (2认同)

zil*_*n01 14

要获得CPU使用率,请定期对处理时间进行采样,并找出差异.

例如,如果这些是进程1的CPU时间:

kernel: 1:00:00.0000
user:   9:00:00.0000
Run Code Online (Sandbox Code Playgroud)

然后你在两秒钟后再次获得它们,它们是:

kernel: 1:00:00.0300
user:   9:00:00.6100
Run Code Online (Sandbox Code Playgroud)

你减去内核时间(差异0.03)和用户时间(0.61),将它们加在一起(0.64),然后除以2秒的采样时间(0.32).

因此,在过去的两秒钟内,该进程平均使用32%的CPU时间.

获取此信息所需的特定系统调用(显然)在每个平台上都是不同的.在Windows上,如果需要快捷方式使用时间或空闲CPU时间,则可以使用GetProcessTimesGetSystemTimes.


小智 8

一种方法如下:

选择一个采样间隔,比如每5分钟(300秒)的实际经过时间.你可以从中得到这个gettimeofday.

获取您在300秒内使用的处理时间.您可以使用此times()调用来获取此信息.这将是new_process_time - old_process_time,这里old_process_time是你的最后的时间段节省了处理时间.

您的cpu百分比是那么(process_time/elapsed_time)*100.0 您可以设置一个警报,每隔300秒发出一次警报来进行这些计算.

我有一个进程,我不想使用超过某个目标CPU百分比.这种方法效果很好,与我的系统监视器很吻合.如果我们使用太多的CPU,我们会睡一会儿.