降低Linux上的性能变化

问题描述:

我正在尝试在基于Linux的英特尔奔腾上运行一个软件的基准测试。问题是,在使用RDTSC指令时,在连续测试运行期间,我得到了相当大的性能变化。完全相同的软件运行时间在500万到1000万个时钟周期之间变化,所以在最坏的情况下,我的开销为100%。我知道有缓存争用导致的性能变化,但是,有没有办法可以消除其他潜在问题,如中断,其他进程等?降低Linux上的性能变化

感谢任何有用的提示如何正确地做到这一点。

非常感谢, 肯尼

+0

mio =百万(对不起,我感到困惑) – Kenny 2010-01-26 10:15:04

一些通用的东西:提高测试进程的优先级(人1很好),停止其他许多工艺越好,卸载未使用的内核模块,刷新磁盘缓存(这样的背景内核线程有更少的工作),在单用户模式下重启?

在这个面积一般常见的问题有:在多CPU /多核系统

  • 进程迁移
  • RDTSC横跨在多CPU /多核系统
  • 其他内核并不一致进程获取CPU时间(也中断,I/O,屏幕活动等)
  • 自动CPU时钟频率缩放
  • VM页故障等

解决方案:

  • 如果你在一个多CPU /多核系统上运行单线程程序,然后使用CPU亲和力的过程中锁定到特定的核心。 (使用命令行中的taskset或从代码中调用sched_setaffinity()。)

  • 确保您没有其他进程需要CPU时间,禁用屏幕保护程序或其他桌面动画,并确保没有屏幕更新你的代码正在运行。也不要使用例如在您的代码时间内将printf添加到GUI控制台窗口中 - 保存任何结果输出,直到收集完上次的时间戳记为止。 (如果可能的话,你甚至可以考虑完全杀死GUI)。

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

  • 禁用自动时钟频率缩放(例如Linux操作系统:CPU频率集)

  • 在一个循环中运行的代码,用于说Ñ重复,优选地重复使用相同的内存分配用于任何大的数据结构(以摆脱虚拟机页面错误等的影响)。忽略第一次测量并平均余下的N - 1次测量。

+0

我知道RDTSC有多核时有问题!为此,我在启动过程中禁用了其中一个内核,以确保这不会成为我测量的问题。所有其他的事情我已经考虑了很多。感谢您的帮助 – Kenny 2010-01-26 09:56:10

,以减少因系统环境变化的最好的办法就是在“单用户”模式,也被称为initlevel 1,或者“恢复模式”运行的基准。

您可以通过将“-s”作为引导时间选项传递给内核来启动到此模式,或者您可以使用“init 1”将正在运行的系统切换到该模式。

在此模式下,所有守护进程都会停止,并且您以root身份登录。几乎任何在系统上运行的任何东西都会从您的交互式终端运行。

+0

听起来不错,我会放弃它! – Kenny 2010-01-26 09:54:42

+0

尝试过,不幸的是变化仍然存在。 – Kenny 2010-01-26 10:25:25

请确保在BIOS和操作系统中禁用频率缩放。此外,它听起来像你正在使用一个P4,所以确保你关闭超线程。

由于这种情况,我遇到过像以前描述的性能变化。

This page介绍如何将它打开,这应该给你你需要关掉它。

您还需要重新启动机器并查看BIOS设置,以确定它是否自动执行,而无需操作系统知道。

+0

感谢您的线索。那么你是否说我应该先检查BIOS,如果我可以在操作系统级别解决这个问题之前禁用频率调整?或者我还需要在操作系统中进行更改?干杯 – Kenny 2010-01-26 10:22:29

+0

修复BIOS比较容易,如果你不修复它,你不会在操作系统上取得任何进展 - 所以先做。 – 2010-01-26 11:49:18

您是否考虑过运行valgrinds cachegrind或callgrind工具中的代码? 这些应该能够通过valgrinds“VM”运行代码为您提供准确的指令计数。