Linux
磁碟記憶體機制有多智能?
Linux 的磁碟記憶體(頁面記憶體)用於記憶體文件數據,並使用盡可能多的 RAM。升級伺服器的 RAM 後,我能夠以比我的磁碟允許的速度更快的速度下載大文件。但前提是該文件之前已經下載過一次,這對我來說絕對合乎邏輯:
第一次下載:
第二次下載(僅部分來自記憶體?):
第三次下載:
但這是否意味著,一個與我的緩衝區大小一樣大或更大的文件,它會覆蓋所有訪問頻率更高的記憶體文件?或者是否有一種智能機制可以在不再訪問大文件後“重新抓取”那些“熱”文件?
但這是否意味著,一個與我的緩衝區大小一樣大或更大的文件,它會覆蓋所有訪問頻率更高的記憶體文件?
不,記憶體比這更智能。頁面記憶體中的頁面在兩個列表中進行跟踪,即非活動列表和活動列表。當一個頁面出現故障時(即從磁碟讀取數據),它最初被添加到非活動列表中;如果再次訪問,則將其提升為活動列表。頁面僅從非活動列表中逐出。
特別是,這意味著讀取一次的大文件不會驅逐多次使用的小文件。
這也解釋了您看到的行為。當您第一次下載大文件時,它被讀入記憶體,但隨著 Web 伺服器處理該文件而逐漸被驅逐。因此,您的第二次下載沒有在記憶體中開始;但它最終趕上了仍在記憶體中的頁面。第二次下載導致相應的頁面變得更需要保留在記憶體中,而您的第三次下載發現記憶體中的所有內容。
您將在核心原始碼中找到此方法的詳細說明。
或者是否有一種智能機制可以在不再訪問大文件後“重新抓取”那些“熱”文件?
然而,這是核心沒有的那種智能機制(一個類似的例子是核心在系統安靜時將未使用的頁面移動到交換的持久想法;它沒有)。核心不會嘗試過多地預測未來。這個“規則”的一個例外是它確實在塊設備上執行預讀,但僅此而已。