减少Linux上的性能差异

Ken*_*nny 4 linux performance benchmarking

我正在尝试对在基于Linux的Intel Pentium上运行的软件进行基准测试。问题是,当使用RDTSC指令时,我在连续的测试运行期间会出现相当大的性能差异。完全相同的软件运行时间在500万到1000万个时钟周期之间变化,因此在最坏的情况下,我的开销为100%。我知道缓存争用会导致性能变化,但是,是否有办法消除其他潜在问题,例如中断,其他进程等?

非常感谢您如何正确执行此操作的任何有用提示。

非常感谢,肯尼

Pau*_*l R 5

此一般领域中的常见问题是:

  • 多CPU /多核系统中的进程迁移
  • RDTSC在多CPU /多核系统中的各个核之间不一致
  • 其他占用CPU时间的进程(也包括中断,I / O,屏幕活动等)
  • 自动CPU时钟频率缩放
  • VM页面故障等

解决方案:

  • 如果要在多CPU /多核系统上运行单线程进程,请使用CPU关联性将进程锁定到特定的内核。(从命令行使用任务集,或从代码内调用sched_setaffinity()。)

  • 确保没有其他占用CPU时间的进程,禁用屏幕保护程序或其他桌面动画,并确保代码运行时没有屏幕更新。另外,在代码计时期间,请勿将printf用于GUI控制台窗口-保存所有结果输出,直到收集完最后一个时间戳为止。(如果可能,您甚至可以考虑完全杀死GUI。)

  • 使用比RDTSC更可靠的计时方法(我通常在Linux上使用clock_gettime(CLOCK_PROCESS_CPUTIME_ID,...)。

  • 禁用自动时钟频率缩放(例如,Linux:cpufreq-set)

  • 循环运行您的代码,例如重复N次,最好对任何大型数据结构重新使用相同的内存分配(以摆脱VM页面错误等的影响)。忽略第一个测量并平均其余N-1个测量。


ygr*_*rek 1

一些一般性的事情:提高测试进程优先级(man 1 Nice),停止尽可能多的其他进程,卸载未使用的内核模块,刷新磁盘缓存(以便后台内核线程减少工作),在单用户模式下重新启动?