如何避免內核中的頁面緩存,應用程序可以直接從磁盤寫入或讀取數據?在內核中如何設置?如何在Linux內核中禁用頁面緩存?
回答
您將需要該應用程序調用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).
打開一個文件,請求就像這樣發送,打開(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
嗯所以IIUC你想通過gluster FUSE掛載的網絡文件系統打開一個文件,並且希望打開服務器以便在不使用服務器的頁面緩存的情況下打開該文件,但是您希望客戶端能夠將這個文件指定給服務器。如果這種理解是正確的,我會說你需要閱讀gluster fs協議規範,看看它是否將這種屬性傳遞給服務器。 –
- 1. 頁面緩存如何在內存中工作?具體在Linux
- 2. Java servlet如何禁用頁面緩存
- 3. 如何使用指針訪問Linux內核空間中的內存頁面
- 4. 禁用頁面緩存不會禁用資源緩存嗎?
- 5. 在單個頁面上禁用緩存
- 6. Linux頁面緩存列表
- 7. 釋放linux頁面緩存
- 8. 在Expression Engine 1.6中,如何禁用特定頁面的緩存?
- 9. 如何在Linux內核模塊中分配可執行頁面?
- 10. 如何清理Linux內核使用的緩存
- 11. Linux內核 - 刷新VFS Dentry緩存
- 12. 緩存中有內存時的Linux內核模塊OOM
- 13. 如何在linux內核中使用malloc()創建緩衝區?
- 14. 如何在linux內核中使用連續內存?
- 15. 如何在Linux內核中遍歷文件地址空間的頁面緩存樹(基數樹)
- 16. Linux內核代碼段內存頁面修改
- 17. Linux內核中磁盤文件的I/O緩衝區緩存
- 18. 如何禁用客戶端在Linux的CIFS(samba)中的緩存
- 19. 如何在Linux內核中使用RSA
- 20. 如何在Linux內核中使用tpm
- 21. 如何在linux內核中使用scanf?
- 22. linux內核頁面表更新
- 23. Linux內核頁面故障棧回溯
- 24. 在Linux內核模塊中刷新CPU數據緩存
- 25. 如何禁用在Linux內核模塊簽名
- 26. 如何操作Linux中的頁面緩存?
- 27. 如何在內核/內核配置中禁用DVFS?
- 28. 如何禁用單個圖像(單個頁面)上的緩存?
- 29. 如何禁用的Django/mod_wsgi的頁面緩存
- 30. 在Linux內核中對slab內存管理進行緩存着色
目前還不清楚你在問什麼。您是否希望僅針對用戶空間中的某個特定應用程序或所有用戶空間進程禁用頁面緩存?你是否必須在內核本身上做到這一點,或者它將如何完成並不重要?請提供更多細節。 –
我只想爲GlusterFS.By保險絲禁用頁面緩存,我通過direct-io-mode(受支持的FUSE)將GlusterFS客戶端(nodeA)掛載到/ mnt/glusterfs。當我在GlusterFS中打開文件時,文件不是因爲FUSE支持direct-io模式,所以緩存在GlusterFS客戶端(nodeA)中,但是文件被緩存在GlusterFS服務器(nodeB)中。換句話說,在服務器(nodeB)中,我不想緩存文件。所以問題是,如何禁用GlusterFS服務器(nodeB)的頁面緩存? – user6481589
打開一個文件,請求發送像這樣,打開(User-Space,nodeA)---> sys_open(Kernel,nodeA)-----> fuse_open(kernel,nodeA)-------> client_open(用戶空間,nodeA上)------------> server_open(用戶空間,節點B)-------> SYS_OPEN(內核,節點B)------- > ext4_open(內核,節點B)。 – user6481589