对于我们用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%?
这是解决此问题的正确方法吗?
环境:
不确定以前是否回答过,任何参考文献都会有所帮助。
答案 0 :(得分:3)
不,您不能依赖“在轮询模式下在处理器核心上执行的每秒循环/轮询次数”。
这是传统操作系统中执行环境的一个基本方面,例如您正在使用的操作系统:主流Linux。
任何时候,一个重量级的cron作业都可以被启动,立即对某些资源提出要求,内核的调度程序决定抢占你的应用程序并做其他事情。这只是导致您的流程被抢占的数百种可能原因之一。
即使您以root身份运行,也无法完全控制流程的资源。
您在轮询指标中看到如此广泛,偶然的差异这一事实应该是一个很大的,有意思的线索:多任务操作系统不能像这样工作。
还有其他“实时”操作系统,其中用户空间应用程序可以具有特定的“服务级别”保证,即可用的最小CPU或I / O资源,您可以依赖它来保证特定代码的次数。序列可以执行,每秒或其他一些指标。
在Linux上,有一些可以摆弄的东西,例如进程的nice
级别,以及其他一些东西。但是,无论如何,这仍然不会给你任何绝对的保证。
特别是因为你甚至没有在裸机上运行,但是你在虚拟管理程序中运行。因此,您的实际执行配置文件不仅会受到主机操作系统的影响,还会影响您的客户操作系统!
保证您正在寻找的指标类型的唯一方法是使用实时操作系统,而不是Linux。几年前,我听说过Linux内核的实时扩展(谷歌食品:“linux rtos”),但最近还没有听到太多。我不相信主流的Linux发行版包含那个内核扩展,所以,如果你想这样做,你就可以独立完成。
答案 1 :(得分:0)