gpt4 book ai didi

c++ - 轮询模式下的 CPU 使用率

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:08 26 4
gpt4 key购买 nike

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

用于计算 polls/second 的示例代码如下所示。

#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=...) 隔离内核,设置亲和性,将进程/线程的优先级提高到最高 nice 值并将类型设置为实时 (RT)

但没有区别。

所以问题是,我们能否依赖轮询模式下处理器内核每秒执行的循环/轮询次数?

有没有办法计算轮询模式下的 CPU 占用率,因为核心 CPU 利用率在顶部显示为 100%?

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

环境:

  • 英特尔(R) 至强(R) CPU E5-2680 v3 @ 2.50GHz
  • 8G内存
  • Vmware 管理程序上的 Ubuntu 虚拟机。

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

最佳答案

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

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

在任何时候,一个重量级的 cron 作业可能会启动,这会对某些资源提出即时需求,并且内核的调度程序会决定抢占您的应用程序并执行其他操作。这只是您的进程被抢占的数百个可能原因之一。

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

您在投票指标中看到如此广泛、偶然的差异这一事实应该是一个重要的提示:多任务操作系统不是这样工作的。

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

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

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

保证您正在寻找的指标类型的唯一方法是使用实​​时操作系统,而不是 Linux。几年前,我听说过 Linux 内核的实时扩展(Google food:“linux rtos”),但最近没怎么听说过。我认为主流 Linux 发行版不包含该内核扩展,因此,如果您想走那条路,您就得靠自己了。

关于c++ - 轮询模式下的 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34077745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com