我正在寻找一种方法来为 Ubuntu 14.04 下的程序获取一致的时间测量值(不同运行之间的差异小于 1%)。显示尽管我的程序从未将控制权交给 OS(无 I/O、无内存分配等),但我仍然会进行相当多的上下文切换。我确实在屏蔽 CPU 上perf stat
运行该程序(我的CPU 有四个物理核心,BIOS 中禁用了超线程),并切换到。sudo nice -n -20
Intel i7 CPU
-k on
cset shield
我理解不可移动的内核进程是上下文切换的来源。所以,我的问题是:有没有办法在启动时设置屏蔽,以便那些不可移动的进程从一开始就在非屏蔽的 CPU 上运行?如果答案是“否”,还有其他方法可以在 Ubuntu 下为我的关键进程获取纯净的环境吗?
答案1
我要冒险一试,一般来说这在 Linux 上是不可能的。
在 SMP 系统中,每个核心上都运行着一个调度程序,这就是您仍然需要上下文切换的原因。如果您的应用程序真的那么重要,也许您应该使用某种 RTOS,而不是 Linux。
答案2
看一下 schedtool 包。它为用户提供 CPU 锁定功能和 CPU 调度程序选择。
担心 GUI 会影响某些事情?从虚拟终端中,关闭 X 并查看。使用 i7 CPU 可能有足够的核心,因此这无关紧要。这完全是控制共享资源的问题,而 CPU 只是其中一种资源。有些资源非常丰富,很难记住它们是共享的,例如内存。您越是确保您的“关键进程”不受任何其他事物的延迟,从用户交互的角度来看,您的通用 Linux 操作系统的表现就越糟糕。
答案3
我不知道你说的非屏蔽处理器是什么意思,但是将任何进程分配给 CPU 的方法是使用任务集。您甚至可以在内核模块上使用它来强制执行粗略的 NUMA 策略。
答案4
当我想运行可比较的实验时,我会:锁定 CPU 时钟频率或调节器,以避免可能出现的响应差异;强制任务在特定的 CPU 上运行(如果不是多线程的话);如果涉及任何磁盘 I/O 或任何其他缓存源,请在运行之间刷新内存缓存以进行公平的比较。
对于我的实验来说,这已经足够好了,但对你来说可能还不够。如果需要的话,我会编辑此内容并添加更多细节。
编辑:我忘了提了,这很重要。我只使用 Ubuntu 服务器版本进行这种类型的工作。台式机有太多其他东西一直在运行。因此,一台“空闲”的计算机实际上根本就不是空闲的。在空闲的服务器上,只有偶尔的 cron 作业,这可能会并且确实会搞乱实验的运行。
例如,我运行了一个程序 262 次,平均执行时间为 5.6217 秒。运行时间标准偏差为 0.0119 秒,总体最差情况为 +0.68% 和 -0.56%。我强制使用 CPU 7 和强制使用性能模式(但请注意,即使在性能模式下,英特尔 i7 处理器也可以自行降低时钟频率。)
此外,如果我禁用 intel_pstate 频率调节器并在“省电”模式下使用 acpi_cpufreq 调节器,基本上将 CPU 锁定在最低 pstate(最低频率),那么我得到大约 +/- 0.01% 的运行时间变化,平均运行时间为 13.22 秒。