使 Linux 讀取交換回記憶體
當我執行一個使用大部分 16GB 物理記憶體的應用程序時,Linux 核心會從記憶體中換出大部分頁面。應用程序完成後,每個操作(鍵入命令、切換工作區、打開新網頁等)都需要很長時間才能完成,因為首先需要從交換中讀回相關頁面。
有沒有辦法告訴 Linux 核心將頁面從交換複製回物理記憶體,而無需手動觸摸(並等待)每個應用程序?我執行了很多應用程序,所以等待總是很痛苦。
我經常使用
swapoff -a && swapon -a
使系統再次響應,但這會清除交換頁面,因此下次執行腳本時需要再次寫入它們。是否有核心介面(可能使用 sysfs)來指示核心從交換中讀取所有頁面?
編輯:我確實在尋找一種方法來使所有交換交換記憶體。(謝謝德羅伯特!)
[PS serverfault.com/questions/153946 /…和serverfault.com/questions/100448 / … 是相關主題,但沒有解決如何讓 Linux 核心將頁面從交換複製回記憶體而不清除交換的問題。]
它可能有助於提高
/proc/sys/vm/page-cluster
(預設值:3)。從核心文件(
sysctl/vm.txt
):頁群
page-cluster 控制一次嘗試從交換中讀取連續頁的頁數。這是頁面記憶體預讀的交換對應物。提到的連續性不是在虛擬/物理地址方面,而是在交換空間上連續 - 這意味著它們被一起換出。
它是一個對數值 - 將其設置為零表示“1 頁”,將其設置為 1 表示“2 頁”,將其設置為 2 表示“4 頁”,依此類推。零會完全禁用交換預讀。
預設值為三(一次八頁)。如果您的工作負載是交換密集型的,則將其調整為不同的值可能會有一些小好處。
較低的值意味著初始故障的延遲較低,但與此同時,如果後續故障是連續頁面預讀的一部分,則會帶來額外的故障和 I/O 延遲。
該文件沒有提到限制,因此您可能可以將其設置得高得離譜,以使所有交換都很快被讀回。當然,之後將其恢復為正常值。
在我看來,你不能神奇地“讓系統再次響應”。您要麼現在受到懲罰,要麼現在將頁面從交換空間讀回記憶體,要麼稍後再產生,但以一種或另一種方式產生。事實上,如果你做類似的事情,
swapoff -a && swapon -a
你可能會感到更多的痛苦,而不是更少,因為你強制將一些頁面複製回記憶體中,否則這些頁面將不再需要並最終被刪除而不被讀取(想想:你退出應用程序,而它的大部分堆被換出;這些頁面可以被完全丟棄,而不會被讀回記憶體)。但這會從交換中清除頁面,因此下次我執行腳本時需要再次寫入它們。
好吧,幾乎任何從交換複製回主記憶體的頁面無論如何都將被修改,因此如果將來需要將其移回再次交換,無論如何都必須在交換中重新寫入。請記住,交換主要是堆記憶體,而不是只讀頁面(通常是文件支持的)。
我認為你的
swapoff -a && swapon -a
把戲和你能想出的任何東西一樣好。