交換用完後什麼時候清空?
我剛剛執行了 4 個記憶體(和 CPU)密集型任務實例,它們幾乎耗盡了所有 16 GB 記憶體,並且還佔用了交換空間(2GB)的一大口。現在程序完成了,我注意到(通過 conky)RAM 被釋放,處理器幾乎回到空閒狀態,但交換分區仍然幾乎滿了。
這讓我想到了我的問題,核心什麼時候清空交換?隨之而來的是,我要執行另一批密集型程序,它們也需要獲得一些交換空間;交換會清空不相關的資訊,還是會簡單地崩潰?
我將在這個答案中使用“快速記憶”和“慢速記憶”這兩個詞。它們對真實情況的描述非常糟糕,但我認為這有助於解釋正在發生的事情。
你的機器有一個“虛擬記憶體”,它由快記憶體和慢記憶體組成。您的總記憶體空間是加在一起的快+慢記憶體。現在電腦只能直接在快速記憶體上工作,因此作業系統首先使用它。當快速記憶體已滿時,作業系統將嘗試將其部分移動到慢速記憶體。這釋放了一些快速記憶體以供使用。現在,如果程序需要使用慢速記憶體中的一些數據,作業系統會將這段數據從慢速記憶體移回快速記憶體(它可能需要先將一些數據從快速記憶體移出到慢速記憶體以騰出空間)。
這個過程是“分頁”,因為系統足夠聰明,它只需要移動記憶體頁面而不是整個程序。一個程序可以同時存在於快記憶體和慢記憶體中。從您的角度來看,唯一的區別是慢記憶是慢的。
現在,當用完所有快速記憶體的程序完成時,將會有大量的快速記憶體可用,而東西仍然會在慢速記憶體中。但這是一個問題嗎?您擁有相同數量的可用虛擬記憶體,如果需要,系統會將這些頁面移回快速記憶體。如果沒有人想要這些頁面,那麼您不妨將它們留在緩慢的記憶中;它沒有害處!
顯然,在這個故事中,“快記憶體”是 RAM,“慢記憶體”是交換。
好的,這是一個“愚蠢”談話中的簡單化故事。
但它接近發生的事情。
Linux 不交換程序;交換意味著整個程序和數據段一次都到交換設備。取而代之的是 Linux頁面;它將記憶體頁發送到交換設備。這意味著程序可能在 RAM 中有一些頁面,而在交換中可能有一些頁面。如果訪問交換中的頁面,它們將按需“調入”;RAM 中的頁面將被“分頁”以交換以在 RAM 中創建可用空間。
因此,如果您執行的程序用盡了 16Gb RAM 和 2Gb 交換空間,然後程序完成,您可能會在交換空間中留下頁面。但是只有仍然分配給程序的頁面才會在那裡。如果
free
顯示正在使用 1G 交換空間,那麼您仍在某處使用那麼多虛擬記憶體。但是swap中的頁面最近沒有被訪問過,所以可能會留在那裡。現在,根據您的工作負載,您可能會獲得更好的性能,將這些頁面留在交換設備上,或者您可能會獲得更好的性能,主動將它們帶回 RAM。但是在這兩種情況下,您都擁有完全相同數量的可用虛擬記憶體。
(由於 Linux 允許過度使用和其他東西,事情變得更加複雜,但這是基本思想)。
圍繞虛擬記憶體管理( https://www.kernel.org/doc/Documentation/sysctl/vm.txt )有很多調整參數,但除非您真的需要調整,否則您可能只想保留預設值。 https://en.wikipedia.org/wiki/Swappiness可能是唯一值得一看的。