Linux-Kernel

文件支持、鎖定共享記憶體和磁碟互動

  • July 14, 2014

Varnish 是一個 HTTP 加速器,使用一個 ~80MB 文件支持的 SHM 日誌,該日誌被 mlock() 寫入記憶體。Varnish 文件建議將文件儲存在 tmpfs 上以避免不必要的磁碟訪問。但是,如果整個文件都被鎖定在記憶體中,Linux 核心是否仍會寫入支持文件?

我嘗試使用 inotify 和fatrace 來監控這一點,但是由於這種互動可能發生在核心內部,因此這些工具看不到文件活動。文件或文件系統顯然發生了某種更新,因為使用 ls 監視支持文件顯示文件時間發生變化,而 sha1sum 顯示內容正在發生變化,但這實際上涉及磁碟訪問還是這一切都發生在記憶?

基本上,我試圖避免使用 tmpfs 變通方法,因為使用 SHM 來支持 SHM 對於甚至可能不存在的問題似乎是一種醜陋的變通方法。

Varnish 似乎使用普通的記憶體映射文件作為其共享記憶體(而不是例如 POSIX shm_open)。從來源

loghead = mmap(NULL, heritage.vsl_size,
   PROT_READ|PROT_WRITE,
   MAP_HASSEMAPHORE | MAP_NOSYNC | MAP_SHARED,
   heritage.vsl_fd, 0);

在 BSD 上,MAP_NOSYNC請求核心不將共享數據寫入磁碟,除非被強制(例如,釋放記憶體)。當它也被鎖定時,這幾乎不會發生。不幸的是,Linux 不支持MAP_NOSYNC.

因此,Linux 會定期將臟(更改)頁面從記憶體寫入磁碟。將記憶體放在 tmpfs 上可以避免這種情況。Varnish 也可以使用 POSIX 或 SysV 共享記憶體(實際上,POSIX 共享記憶體是在 Linux 上實現的,tmpfs 安裝在/dev/shm,所以使用 tmpfs 應該沒問題)。

引用自:https://unix.stackexchange.com/questions/144508