2016-06-18 31 views
0

如何避免內核中的頁面緩存,應用程序可以直接從磁盤寫入或讀取數據?在內核中如何設置?如何在Linux內核中禁用頁面緩存?

+0

目前還不清楚你在問什麼。您是否希望僅針對用戶空間中的某個特定應用程序或所有用戶空間進程禁用頁面緩存?你是否必須在內核本身上做到這一點,或者它將如何完成並不重要?請提供更多細節。 –

+0

我只想爲GlusterFS.By保險絲禁用頁面緩存,我通過direct-io-mode(受支持的FUSE)將GlusterFS客戶端(nodeA)掛載到/ mnt/glusterfs。當我在GlusterFS中打開文件時,文件不是因爲FUSE支持direct-io模式,所以緩存在GlusterFS客戶端(nodeA)中,但是文件被緩存在GlusterFS服務器(nodeB)中。換句話說,在服務器(nodeB)中,我不想緩存文件。所以問題是,如何禁用GlusterFS服務器(nodeB)的頁面緩存? – user6481589

+0

打開一個文件,請求發送像這樣,打開(User-Space,nodeA)---> sys_open(Kernel,nodeA)-----> fuse_open(kernel,nodeA)-------> client_open(用戶空間,nodeA上)------------> server_open(用戶空間,節點B)-------> SYS_OPEN(內核,節點B)------- > ext4_open(內核,節點B)。 – user6481589

回答

3

您將需要該應用程序調用O_DIRECT。從手冊頁http://man7.org/linux/man-pages/man2/open.2.html

有了這個,您可以告訴內核在執行I/O時不要從頁面緩存寫/讀。

O_DIRECT(自Linux 2.4.10以來) 儘量減少I/O對此文件的緩存影響。一般來說,這會降低性能,但在特殊情況下它很有用,例如當應用程序執行自己的緩存時。文件I/O直接進入用戶空間緩衝區/從用戶空間緩衝區完成。 O_DIRECT標誌本身使努力 同步傳輸數據,但不會保證傳輸數據和必要的元數據的O_SYNC標誌的 。爲了保證同步I/O,O_SYNC必須是除O_DIRECT外還使用的 。有關進一步的 討論,請參閱下面的注意事項。

  A semantically similar (but deprecated) interface for block 
      devices is described in raw(8). 
+0

打開一個文件,請求就像這樣發送,打開(User-Space,nodeA)---> sys_open(Kernel,nodeA)-----> fuse_open(kernel,node A)------ - > client_open(用戶空間,nodeA上)----- -------網絡> server_open(用戶空間,節點B)-------> SYS_OPEN(內核,節點B) - -----> ext4_open(Kernel,nodeB)。在網絡之前,它們屬於GlusterFS客戶端,之後是GlusterFS服務器。如果我在client_open()中添加O_DIRECT標誌,服務器將直接打開文件, IO模式? – user6481589

+0

嗯所以IIUC你想通過gluster FUSE掛載的網絡文件系統打開一個文件,並且希望打開服務器以便在不使用服務器的頁面緩存的情況下打開該文件,但是您希望客戶端能夠將這個文件指定給服務器。如果這種理解是正確的,我會說你需要閱讀gluster fs協議規範,看看它是否將這種屬性傳遞給服務器。 –

相關問題