2010-01-26 109 views
3

我正在嘗試在基於Linux的英特爾奔騰上運行一個軟件的基準測試。問題是,在使用RDTSC指令時,在連續測試運行期間,我得到了相當大的性能變化。完全相同的軟件運行時間在500萬到1000萬個時鐘週期之間變化,所以在最壞的情況下,我的開銷爲100%。我知道有緩存爭用導致的性能變化,但是,有沒有辦法可以消除其他潛在問題,如中斷,其他進程等?降低Linux上的性能變化

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

非常感謝, 肯尼

+0

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

回答

0

一些通用的東西:提高測試進程的優先級(人1很好),停止其他許多工藝越好,卸載未使用的內核模塊,刷新磁盤緩存(這樣的背景內核線程有更少的工作),在單用戶模式下重啓?

3

在這個面積一般常見的問題有:在多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

0

,以減少因系統環境變化的最好的辦法就是在「單用戶」模式,也被稱爲initlevel 1,或者「恢復模式」運行的基準。

您可以通過將「-s」作爲引導時間選項傳遞給內核來啓動到此模式,或者您可以使用「init 1」將正在運行的系統切換到該模式。

在此模式下,所有守護進程都會停止,並且您以root身份登錄。幾乎任何在系統上運行的任何東西都會從您的交互式終端運行。

+0

聽起來不錯,我會放棄它! – Kenny 2010-01-26 09:54:42

+0

嘗試過,不幸的是變化仍然存在。 – Kenny 2010-01-26 10:25:25

0

請確保在BIOS和操作系統中禁用頻率縮放。此外,它聽起來像你正在使用一個P4,所以確保你關閉超線程。

由於這種情況,我遇到過像以前描述的性能變化。

This page介紹如何將它打開,這應該給你你需要關掉它。

您還需要重新啓動機器並查看BIOS設置,以確定它是否自動執行,而無需操作系統知道。

+0

感謝您的線索。那麼你是否說我應該先檢查BIOS,如果我可以在操作系統級別解決這個問題之前禁用頻率調整?或者我還需要在操作系統中進行更改?乾杯 – Kenny 2010-01-26 10:22:29

+0

修復BIOS比較容易,如果你不修復它,你不會在操作系統上取得任何進展 - 所以先做。 – 2010-01-26 11:49:18

0

您是否考慮過運行valgrinds cachegrind或callgrind工具中的代碼? 這些應該能夠通過valgrinds「VM」運行代碼爲您提供準確的指令計數。