簡體   English   中英

減少Linux上的性能變化

[英]Reducing performance variations on Linux

我試圖對基於Linux的Intel Pentium上運行的軟件進行基准測試。 問題是,在使用RDTSC指令時,在連續測試運行期間,我得到了相當大的性能變化。 完全相同軟件的運行時間在500萬到1000萬個時鍾周期之間變化,因此在最壞的情況下,我的開銷為100%。 我知道存在由緩存爭用引起的性能差異,但是,我是否有可能消除其他潛在問題,如中斷,其他進程等?

感謝任何有用的提示如何正確地做到這一點。

非常感謝,肯尼

這個一般領域的常見問題是:

  • 多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: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM