降低Linux上的性能变化
我正在尝试在基于Linux的英特尔奔腾上运行一个软件的基准测试。问题是,在使用RDTSC指令时,在连续测试运行期间,我得到了相当大的性能变化。完全相同的软件运行时间在500万到1000万个时钟周期之间变化,所以在最坏的情况下,我的开销为100%。我知道有缓存争用导致的性能变化,但是,有没有办法可以消除其他潜在问题,如中断,其他进程等?降低Linux上的性能变化
感谢任何有用的提示如何正确地做到这一点。
非常感谢, 肯尼
一些通用的东西:提高测试进程的优先级(人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次测量。
我知道RDTSC有多核时有问题!为此,我在启动过程中禁用了其中一个内核,以确保这不会成为我测量的问题。所有其他的事情我已经考虑了很多。感谢您的帮助 – Kenny 2010-01-26 09:56:10
请确保在BIOS和操作系统中禁用频率缩放。此外,它听起来像你正在使用一个P4,所以确保你关闭超线程。
由于这种情况,我遇到过像以前描述的性能变化。
This page介绍如何将它打开在,这应该给你你需要关掉它。
您还需要重新启动机器并查看BIOS设置,以确定它是否自动执行,而无需操作系统知道。
感谢您的线索。那么你是否说我应该先检查BIOS,如果我可以在操作系统级别解决这个问题之前禁用频率调整?或者我还需要在操作系统中进行更改?干杯 – Kenny 2010-01-26 10:22:29
修复BIOS比较容易,如果你不修复它,你不会在操作系统上取得任何进展 - 所以先做。 – 2010-01-26 11:49:18
mio =百万(对不起,我感到困惑) – Kenny 2010-01-26 10:15:04