Linux

Linux 不會丟棄 FS 記憶體。相反,記憶體開始交換

  • May 27, 2015

我對linux記憶體記憶體的這種行為感到很困惑。

            total       used       free     shared    buffers     cached
Mem:         15953      14188       1765         64         37      11504
-/+ buffers/cache:       2645      13308
Swap:         2047       1332        715

不應該對記憶體有非記憶體記憶體優先級嗎?換句話說:為什麼機器交換到磁碟,而不是丟棄記憶體。

我可以改變這種行為嗎?如果是,如何?

linux 交換算法使用“最近使用的頁面”的概念。虛擬記憶體中的每個頁面都有一個與之關聯的年齡。如果該頁面被頻繁訪問,則該頁面的年齡應該很年輕,而如果一個頁面沒有被訪問,那麼該頁面就會變老。頁面越舊,它們被換出的可能性就越大。

因此,如果核心將內容交換出去,那是因為這些頁面的年齡(與其他頁面相比)較舊。如果所有頁面都有足夠的物理記憶體,無論它們的年齡如何,都不會交換任何內容。

核心被配置為以最有效的方式處理他的資源,例如記憶體和交換,這是可能的。

我認為你不應該改變這種行為。但是,如果您願意,您可以更改系統交換性。將 swappiness 設置為 0 意味著除非絕對必要(記憶體不足),否則將避免使用磁碟。

核心文件中關於 的值swappiness

此控制項用於定義核心交換記憶體頁面的積極程度。較高的值會增加攻擊性,較低的值會減少交換量。值 0 指示核心在空閒和文件支持的頁面數量小於區域中的高水位線之前不啟動交換。

在 linux 核心原始碼中,該文件vmscan.c處理 swappiness 值。這是有趣的部分:

2018         /*
2019          * With swappiness at 100, anonymous and file have the same priority.
2020          * This scanning priority is essentially the inverse of IO cost.
2021          */
2022         anon_prio = swappiness;
2023         file_prio = 200 - anon_prio;
  • 匿名頁面是沒有文件或設備支持的記憶體映射。這就是程序如何從作業系統分配記憶體以供堆棧和堆之類的東西使用。
  • 文件頁面反映現有文件的內容。

正如您在上面的原始碼片段中看到的,交換文件頁面的優先級(預設值為 60)高於交換匿名頁面。但是,如果設置為 100,則兩個值具有相同的優先級。如果設置為 0,則優先級差異盡可能大。

您可以按如下方式設置swappiness:

echo n >/proc/sys/vm/swappiness

n0-100 的值在哪裡。

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