轮询模式下的CPU utlization

时间:2015-12-03 22:50:04

标签: c++ linux multithreading dpdk

对于我们用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 ram
  • Vmware虚拟机管理程序上的Ubuntu虚拟机。

不确定以前是否回答过,任何参考文献都会有所帮助。

2 个答案:

答案 0 :(得分:3)

不,您不能依赖“在轮询模式下在处理器核心上执行的每秒循环/轮询次数”。

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

任何时候,一个重量级的cron作业都可以被启动,立即对某些资源提出要求,内核的调度程序决定抢占你的应用程序并做其他事情。这只是导致您的流程被抢占的数百种可能原因之一。

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

您在轮询指标中看到如此广泛,偶然的差异这一事实应该是一个很大的,有意思的线索:多任务操作系统不能像这样工作。

还有其他“实时”操作系统,其中用户空间应用程序可以具有特定的“服务级别”保证,即可用的最小CPU或I / O资源,您可以依赖它来保证特定代码的次数。序列可以执行,每秒或其他一些指标。

在Linux上,有一些可以摆弄的东西,例如进程的nice级别,以及其他一些东西。但是,无论如何,这仍然不会给你任何绝对的保证。

特别是因为你甚至没有在裸机上运行,​​但是你在虚拟管理程序中运行。因此,您的实际执行配置文件不仅会受到主机操作系统的影响,还会影响您的客户操作系统!

保证您正在寻找的指标类型的唯一方法是使用实​​时操作系统,而不是Linux。几年前,我听说过Linux内核的实时扩展(谷歌食品:“linux rtos”),但最近还没有听到太多。我不相信主流的Linux发行版包含那个内核扩展,所以,如果你想这样做,你就可以独立完成。

答案 1 :(得分:0)

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