轮询模式下的CPU使用率

CPU utlization on poll mode

本文关键字:CPU 使用率 模式      更新时间:2023-10-16

对于我们用c++编写的项目,我们在轮询模式下运行处理器内核来轮询驱动程序(dpdk),但在轮询模式中,cpu利用率在top/htop中显示为100%。当我们开始看到数据包丢失的小故障时,计算了内核上每秒执行的循环或轮询的数量(根据处理器速度和类型而不同)。

用于计算每秒轮询次数的示例代码如下,其中包含和不包含驱动程序轮询功能的开销。

#include <iostream>
#include <sys/time.h>
int main() {
    unsigned long long counter;
    struct timeval tv1, tv2;
    gettimeofday(&tv1, NULL);
    gettimeofday(&tv2, NULL);
    while(1) {
        gettimeofday(&tv2, NULL);
        //Some function here to measure the overhead
        //Poll the driver
        if ((double) (tv2.tv_usec - tv1.tv_usec) / 1000000 + (double) (tv2.tv_sec - tv1.tv_sec) > 1.0) {
            std::cout << std::dec << "Executions per second = " << counter << " per second" << std::endl;
            counter = 0;
            gettimeofday(&tv1, NULL);
        }
        counter++;
    }
}

轮询计数结果各不相同,有时我们会看到一个小故障,数字比正常计数下降50%或更低,认为这可能是linux调度任务的问题,所以使用linux命令行隔离内核(isolcpus=…),设置亲和性,将进程/线程的优先级提高到最高值,并将类型提高到实时(RT)

但没有区别。

所以问题是,我们可以依赖于在轮询模式下在处理器核心上每秒执行的循环/轮询的数量吗?

有没有一种方法可以计算轮询模式下的CPU占用率,因为核心CPU利用率显示为100%?

这是解决这个问题的正确方法吗?

环境:

  • Intel(R)Xeon(R)CPU E5-2680 v3@2.50GHz
  • 8G内存
  • Vmware系统管理程序上的Ubuntu虚拟机

不确定以前是否回答过这个问题,任何参考资料都会有所帮助。

否,您不能依赖"在轮询模式下,处理器内核上每秒执行的循环/轮询数"。

这是传统操作系统中执行环境的一个基本方面,例如您正在使用的主流Linux。

在任何时候,一个繁重的cron作业都可能被启动,这会立即对一些资源产生需求,内核的调度程序决定抢占您的应用程序并做其他事情。这只是您的流程被抢占的数百个可能原因之一。

即使您以root身份运行,也无法完全控制流程的资源。

事实上,你看到你的民意调查指标偶尔会出现如此大的差异,这应该是一个很大的线索:多任务操作系统不是这样工作的。

在其他"实时"操作系统中,用户空间应用程序可以有特定的"服务级别"保证,即可用的最低CPU或i/O资源,您可以依靠这些资源来保证特定代码序列每秒执行次数或其他指标的下限。

在Linux上,有一些事情可以处理,比如进程的nice级别,以及其他一些事情。但这仍然不会给你任何绝对的保证。

特别是因为您甚至不是在裸机上运行,而是在虚拟系统管理程序中运行。因此,您的实际执行配置文件不仅受主机操作系统的影响,还受来宾操作系统的限制!

保证您正在寻找的度量标准的唯一方法是使用实时操作系统,而不是Linux。几年前,我听说过Linux内核的实时扩展(谷歌食品:"Linux-rtos"),但最近很少听说。我不相信主流的Linux发行版包括内核扩展,所以,如果你想走这条路,你就只能靠自己了。

intel cpu上的现代linux确实提供了使轮询循环完全占据cpu核心接近100%的方法。你没有考虑的是,删除会导致上下文切换的系统调用,关闭超线程或不使用同一缓存线上的其他线程,关闭bios中的动态cpu频率提升,取消中断处理。