2011-09-15 79 views
4

我有一個讀取基準測試,並且在連續運行之間,我必須確保數據不駐留在內存中以避免由於高速緩存而出現的影響。到目前爲止,我曾經做過的事情是:運行一個程序,在讀取基準測試的連續運行之間寫入一個大文件。類似於如何在讀取基準測試中避免高速緩存效應

./read_benchmark 
./write --size 64G --path /tmp/test.out 
./read_benchmark 

寫入程序只是將大小爲1G的數組寫入64個文件。由於主內存的大小是64G,我寫了一個大約爲。相同的尺寸。問題在於寫作需要很長時間,我想知道是否有更好的方法來做到這一點,即避免數據緩存時出現的效果。

另外,如果我將數據寫入/ dev/null會發生什麼?

./write --size 64G --path /dev/null 

這樣,寫程序退出速度非常快,實際上沒有執行I/O,但我不知道這是否會覆蓋主內存,這也是我最終要的64G。

非常感謝您的輸入。

回答

2

您只需卸載文件系統並將其裝回即可。卸載刷新並刪除文件系統的緩存。

+0

但我仍然不會清除最近從RAM讀取文件,所以我可能會看到緩存的影響,當我再次安裝它時,不是嗎? – jitihsk

+1

它清除正在卸載的設備的緩衝區緩存。當它被裝回時,設備的內容未確定,以致於內核不能假定舊緩存仍然有效(並且無論如何,緩存已被卸載掉)。 –

4

您可以使用一個特殊的文件拖放所有緩存在/proc這樣的:

echo 3 > /proc/sys/vm/drop_caches 

這應該確保緩存並不影響基準。

+0

清除系統緩存,但不是主內存權利? – jitihsk

2

一個幾乎從未失敗的(粗暴)方式是簡單地佔用所有多餘的內存與另一個程序。

製作一個簡單的程序,分配幾乎所有的空閒內存(同時留下足夠的基準應用程序)。然後memset()的內存來確保操作系統將它提交給物理內存。最後,做一個scanf()暫停程序而不終止它。通過「佔用」所有多餘的內存,操作系統將無法將其用作緩存。這在Linux和Windows中都可以工作。現在您可以繼續執行您的I/O基準測試。

(雖然這樣可能不順利,如果你與其他用戶共享的機...)

2

使用echo 3 > /proc/sys/vm/drop_caches刷新頁緩存,目錄項緩存和inode緩存。

+0

清除系統緩存,但不是主內存權利? – jitihsk

+0

是的,只是緩存 – arnaud576875

+0

我不明白主內存和緩存之間的區別?如果我理解正確,文件將映射到虛擬機中延遲加載的頁面。如果虛擬機刪除頁面緩存,還剩下什麼? – HRJ

2

您可以使用FADV_DONTNEED調用調用來告訴內核保持某些文件不被緩存。您也可以使用mincore()來驗證文件沒有被緩存。雖然drop_cache解決方案顯然更簡單,但這可能比清除整個緩存更好,因爲它會影響盒子上的所有進程。我認爲您不需要提高權限來使用fadvise,而我敢打賭,您可以寫入/ proc 。下面是如何使用fadvise調用來達到此目的的一個很好的示例:http://insights.oetiker.ch/linux/fadvise/

+0

我仍然不確定內核是否會嘗試從主內存或者處理器緩存中釋放頁面。 – jitihsk

+0

如果它沒有清除主內存磁盤緩存,但是您應該可以使用mincore()來驗證它會告訴您文件的哪些頁面處於內核 – frankc