[英]Reducing performance variations on Linux
我試圖對基於Linux的Intel Pentium上運行的軟件進行基准測試。 問題是,在使用RDTSC指令時,在連續測試運行期間,我得到了相當大的性能變化。 完全相同軟件的運行時間在500萬到1000萬個時鍾周期之間變化,因此在最壞的情況下,我的開銷為100%。 我知道存在由緩存爭用引起的性能差異,但是,我是否有可能消除其他潛在問題,如中斷,其他進程等?
感謝任何有用的提示如何正確地做到這一點。
非常感謝,肯尼
這個一般領域的常見問題是:
解決方案:
如果您在多CPU /多核系統上運行單線程進程,則使用CPU親和性將進程鎖定到特定核心。 (從命令行使用taskset或從代碼中調用sched_setaffinity()。)
確保沒有其他進程占用CPU時間,禁用屏幕保護程序或其他桌面動畫,並確保在代碼運行時沒有屏幕更新。 在代碼計時期間也不要使用例如printf到GUI控制台窗口 - 保存任何結果輸出,直到收集完最后一個時間戳。 (如果可能的話,你甚至可以考慮徹底殺死GUI。)
使用比RDTSC更可靠的計時方法(我通常在Linux上使用clock_gettime(CLOCK_PROCESS_CPUTIME_ID,...))。
禁用自動時鍾頻率縮放(例如Linux:cpufreq-set)
在循環中運行代碼,例如N次重復,最好為任何大型數據結構重新使用相同的內存分配(以消除VM頁面錯誤的影響等)。 忽略第一次測量並平均剩余的N-1次測量。
一些常見的事情:提高測試進程的優先級(man 1 nice),停止盡可能多的其他進程,卸載未使用的內核模塊,刷新磁盤緩存(以便后台內核線程工作少),在單用戶模式下重啟?
減少系統環境引起的變化的最佳方法是在“單用戶”模式(也稱為initlevel 1或“恢復模式”)下運行基准測試。
您可以通過將“-s”作為引導時選項傳遞給內核來啟動此模式,也可以使用“init 1”將正在運行的系統切換到該模式。
在此模式下,所有守護程序都將停止,並以root用戶身份登錄。 幾乎所有在系統上運行的東西都是從您的交互式終端運行的。
請確保在BIOS和操作系統中停用頻率調整。 此外,它聽起來像你正在使用P4,所以一定要關閉超線程。
由於這些原因,我遇到了過去描述的性能差異。
此頁面介紹了如何打開它 ,這應該給你你需要關閉它是什么。
您還需要重新啟動計算機並查看BIOS設置以確定它是否自動執行,而無需操作系統知道。
您是否考慮過在valgrinds cachegrind或callgrind工具中運行代碼? 這些應該能夠通過valgrinds“VM”運行代碼為您提供准確的指令計數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.