2011-08-19 106 views
18

我正在創建在Linux服務器上運行的Web應用程序。應用程序不斷地訪問250K文件 - 它將它加載到內存中,讀取它並向用戶發送一些信息。由於這個文件一直被讀取,所以我的客戶建議使用類似memcache的內容將其緩存到內存中,這可能是因爲它會使讀取操作更快。Linux文件系統緩存文件是否有效?

但是,我認爲Linux文件系統可能已經將文件緩存在內存中,因爲它經常被訪問。是對的嗎?在你看來,memcache會提供一個真正的改進嗎?還是它會做同樣的事情,Linux已經在做什麼?

我並不十分熟悉Linux和memcache,所以如果有人能夠澄清這一點,我將非常感激。

+3

沒有「Linux文件系統」。有許多Linux支持的文件系統。 – cdhowie

+2

對於您嘗試解決的任何問題,單塊250k blob聽起來像是錯誤的解決方案。 – tripleee

+3

這聽起來像'mmap'可能更好,並將內存全部留給內核。 –

回答

18

是的,如果您每次打開時都不修改該文件。

Linux會將文件信息保存在內存中的寫時複製頁面上,並且將文件「加載」到內存中應該非常快(頁表交換最糟糕)。

編輯:雖然,正如cdhowie指出的,沒有'linux文件系統'。但是,我相信相關的代碼是在linux的內存管理中,因此獨立於有問題的文件系統。如果你很好奇,你可以閱讀linux源代碼,主要介紹如何處理linux/mm/mmap.c中的vm_area_struct對象。

+3

要添加到答案中,您可以使用'vmtouch'來確保文件在內存中。此鏈接解釋:http://hoytech.com/vmtouch/ 實際上,您可以使用'vmtouch'將文件強制保存在文件系統緩存中。請參閱上面的鏈接。 – goblinjuice

2

是的,絕對。它將無限期地將訪問的文件保存在內存中,除非其他內容需要內存。

您可以使用fadvise系統調用來控制此行爲(某種程度上)。有關更多詳細信息,請參閱其「man」頁面。

讀/寫系統調用仍然通常需要複製數據,因此如果看到這樣做的真正瓶頸,可以考慮使用mmap(),它可以通過將緩存頁直接映射到進程中來避免複製。

3

正如人們所說,mmap在這裏是一個很好的解決方案。

但是,一個250k文件非常小。您可能需要將其讀入並將其放入某種內存結構中,該結構與啓動時要發送給用戶的內容相匹配。也就是說,如果它是一個文本文件的行數列可能是一個不錯的選擇,等等。

1

我想把該文件放入虛擬磁盤(tmpfs)可能會做出足夠的優勢,沒有大的修改。除非你真的對微秒單位的響應時間非常認真。

2

該文件應該被緩存,但要確保在mount上設置了noatime選項,否則訪問時間將嘗試保存到文件中,導致緩存無效。