CPU百分比和繁重的多线程

时间:2019-06-24 09:19:15

标签: linux

我正在观察CPU百分比的奇怪影响,例如Linux(Ubuntu 16.04)上的top或htop的一种特殊应用程序。该应用程序使用许多线程(大约1000个)。每个线程都有一个计算任务。这些任务中大约有一半需要每个“触发器”进行一次计算-触发器是恰好每100毫秒接收一次的外部事件。其他线程大多处于休眠状态(等待用户交互),因此在这里没有很大的作用。总结一下:许多线程在短时间内基本上同时醒来,在那里进行(相对短)的计算,然后又重新进入睡眠状态。

由于运行此应用程序的计算机具有8个虚拟CPU(每个2个线程4个内核,它是i7-3612QE),因此一次只能唤醒8个线程,因此必须等待许多线程。此外,其中一些任务具有相互依赖性,因此无论如何都必须等待,但是我认为,可以近似地认为此应用程序是一堆线程,每100ms一次进入可运行状态,并且每个线程仅进行一次简短的计算(每个CPU时间都低于1毫秒)。

现在产生奇怪的效果:如果我在“顶部”中查看CPU百分比,它显示的是250%。据我所知,最主要的是内核占用此进程的CPU时间(用户+系统),因此250%表示该进程平均使用3个虚拟CPU。到目前为止,一切都很好。现在,如果我使用任务集强制整个过程仅使用一个虚拟CPU,则CPU百分比将降至80%。该应用程序具有内部记帐功能,告诉我仍在处理所有数据。因此,该应用程序执行的工作量相同,但似乎使用了较少的CPU资源。这个怎么可能?我真的可以相信内核CPU时间计帐,还是这是测量的人工产物?

如果我启动其他占用大量CPU的进程,即使不执行任何操作(“ while(true);”)并以低优先级(nice)运行,则CPU百分比也会下降。如果启动了这些CPU占用的进程中的8个,则应用程序再次达到80%。占用更少的CPU占用者,我会逐渐提高CPU%。

不确定这是否起作用:我使用了探查器vtune,它告诉我我的应用程序实际上效率很低(仅大约1个IPC),主要是因为它受内存限制。如果将进程限制为单个虚拟CPU,这不会改变,因此我认为效果不是由在同一内核上运行所有组件时效率的大幅提高引起的(无论如何还是很奇怪的)。

0 个答案:

没有答案