運行性能測試時文件系統緩存命中或未命中可能會顯着影響測試結果。因此,通常在運行此類測試之前,使用的文件將從系統緩存中逐出。如何在Linux上做到這一點?如何從Linux系統緩存中清除文件?
澄清:如果可能,解決方案應該不需要root權限。
運行性能測試時文件系統緩存命中或未命中可能會顯着影響測試結果。因此,通常在運行此類測試之前,使用的文件將從系統緩存中逐出。如何在Linux上做到這一點?如何從Linux系統緩存中清除文件?
澄清:如果可能,解決方案應該不需要root權限。
哈,我找到了答案:
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char *argv[]) {
int fd;
fd = open(argv[1], O_RDONLY);
fdatasync(fd);
posix_fadvise(fd, 0,0,POSIX_FADV_DONTNEED);
close(fd);
return 0;
}
作爲一個超級用戶,你可以做到以下幾點:
要釋放頁緩存:
要免費目錄項和inode:
要釋放頁緩存,目錄項和inode:
此操作將不會 「丟失」 的任何數據(高速緩衝存儲器寫出到但是,要確保清除所有緩存,應首先進行同步。例如。如果你運行,所有的緩存應該被清除
sync; echo 3 > /proc/sys/vm/drop_caches
正如我所說的,只有超級用戶(root)可以這樣做。
關於使用O_DIRECT:會以另一種方式干擾結果。內核將嘗試將文件系統數據直接DMA(DMA)到您的read()緩衝區中,這樣它就可以傳送到您的應用程序,而無需執行任何額外的副本。如果沒有O_DIRECT,內核會將文件數據DMA寫入頁面緩存,並將其從頁面緩存複製到您的read()緩衝區。
這很好,如果你的應用程序真的要在生產中使用O_DIRECT。如果使用O_DIRECT運行性能測試,然後刪除O_DIRECT進行生產,則性能測試將是不現實的。
如果你可以把測試數據在一個單獨的文件系統,然後安裝了測試文件系統重新會給你空緩存。
如果您列出與「用戶」選項/ etc/fstab中測試fileystem那麼你可以將其安裝在測試而不超級用戶
有由黃偉麟一個命令行工具,可以很容易地調用posix_fadvise:
http://git.bogomips.org/cgit/pcu.git/tree/README
這是如此的簡單
$ pcu-fadvise -a dontneed filename-to-evict