轮询模式下的CPU使用率
CPU utlization on poll mode
对于我们用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频率提升,取消中断处理。
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 如何降低应用程序的 CPU 使用率?
- 如何以编程方式获取任务管理器进程CPU使用率(不是PerfMon API)
- 一段时间后 CPU 使用率高
- 高CPU使用率,在API桌面复制中获取帧之间具有不同的超时间隔
- GetDC ReleaseDC 在特定上下文中的高 CPU 使用率
- 从 C++11 代码中获取系统内存和 CPU 使用率
- 在 Visual Studio 中记录 CPU 使用率
- C++如何允许等待而不会过多的 CPU 使用率
- Qtcreator 冻结,CPU 使用率为 100%
- 使用 fgets() c++ 读取大型 txt 文件时的 CPU 使用率为 99%
- OpenCL 的 CPU 使用率意外
- Loop Wregex始终返回false和高CPU使用率约50%
- 简单的C++SFML程序高CPU使用率
- 使用 PID 获取内存和 CPU 使用率
- 如何在TCP端口上实时传输数据期间减少CPU使用率
- WinAPI:在WM_PAINT省略 BeginPaint 和 EndPaint 会导致 100% 的 CPU 使用率
- 当CPU使用率高时,OpenCV会堆积内存吗
- 如何在运行SDL程序时降低CPU使用率