Linux swappeiness值與交換開始前使用了多少RAM無關。這是一個被廣泛報道和普遍相信的錯誤。我們解釋它到底是什麼。
交換是一種將隨機存取儲存器(RAM)中的資料寫入硬碟上的特殊位置(交換分割槽或交換檔案)以釋放RAM的技術。
Linux有一個稱為交換值的設定。關於這個設定控制什麼,有很多困惑。對交換性最常見的錯誤描述是,它為RAM使用設定了一個閾值,當使用的RAM數量達到該閾值時,交換就開始了。
這是一個經常被重複的錯誤觀念,現在它已被接受為智慧。如果(幾乎)其他人都告訴你交換就是這樣工作的,為什麼你要相信我們說不是這樣的呢?
很簡單。我們要證明這一點。
Linux不認為RAM是一個大的同質記憶體池。它認為它被劃分為若干不同的區域,稱為區域。計算機上存在哪些區域取決於它是32位還是64位。下面是x86體系結構計算機上可能的區域的簡化描述。
RAM以固定大小的頁面分配。這個大小是由核心在引導時透過檢測計算機的體系結構來確定的。通常,Linux計算機上的頁面大小是4KB。
可以使用getconf命令檢視頁面大小:
getconf PAGESIZE分割槽附著到節點。節點與中央處理器(CPU)相關聯。核心將嘗試從與CPU相關聯的節點為CPU上執行的程序分配記憶體。
將節點繫結到CPU的概念允許在專業多CPU計算機中安裝混合記憶體型別,使用非統一記憶體訪問體系結構。
這些都是非常高階的。一般的Linux計算機只有一個節點,稱為node zero。所有區域都將屬於該節點。要檢視計算機中的節點和區域,請檢視/proc/buddyinfo檔案。我們將使用更少的資源:
less /proc/buddyinfo這是本文研究的64位計算機的輸出:
Node 0, zone DMA 1 1 1 0 2 1 1 0 1 1 3 Node 0, zone DMA32 2 67 58 19 8 3 3 1 1 1 17有一個節點,節點0。這臺計算機只有2GB的RAM,所以沒有“正常”區域。只有兩個區域,DMA和DMA32。
每列表示特定大小的可用頁數。例如,對於DMA32區域,從左側讀取:
但實際上,我們檢視這些資訊的唯一原因是檢視節點和區域之間的關係。
記憶體對映使用頁表條目集來記錄哪些記憶體頁被使用,以及用於什麼目的。
記憶體對映可以是:
對於交換,我們只需要關注列表中的前兩個:檔案頁和匿名頁。
以下是GitHub上Linux文件中對交換的描述:
此控制元件用於定義核心交換記憶體頁的攻擊性(sic)。較高的值會增加攻擊性,較低的值會減少交換量。值0指示核心在空閒頁和檔案備份頁的數量小於區域中的高水位線之前不啟動交換。
預設值為60。“
這聽起來像是交換在強度上會上下轉換。有趣的是,它指出將swappeiness設定為零並不能關閉swap。它指示核心在滿足某些條件之前不要交換。但是交換仍然可以發生。
我們再深入一點。以下是核心原始碼檔案vmscan.c中vm\u交換的定義和預設值:
/**從0。。100越高意味著交換越多。*/int vm\u swappeiness=60;
交換性值的範圍從0到100。同樣,這個註釋聽起來很像swappeiness值與交換髮生的次數有關,越高的值導致交換越多。
進一步在原始碼檔案中,我們可以看到一個名為swappeiness的新變數被分配了一個由函式mem\u cgroup\u swappeiness()返回的值。對原始碼的進一步跟蹤將顯示此函式返回的值是vm\u swappeiss。所以現在,變數swappeiss設定為等於vm\u swappeiss設定的值。
int swappeiness=mem\u cgroup\u swappeiness(memcg);
再往下一點,在同一個原始碼檔案中,我們看到:
/**交換為100時,匿名和檔案具有相同的優先順序。*此掃描優先順序基本上與IO開銷相反。*/anon\u prio=swappeiss;file\u prio=200-anon\u prio;
那很有趣。兩個不同的值來自交換。anon\u prio和file\u prio變數儲存這些值。一個增加,另一個減少,反之亦然。
Linux swappeiness值實際上設定了兩個值之間的比率。
如果釋放記憶體,檔案頁儲存的資料很容易檢索。Linux可以再次讀取檔案。如我們所見,如果檔案資料在RAM中發生了更改,那麼在釋放檔案頁之前,必須將這些更改寫入檔案。但是,無論哪種方式,RAM中的檔案頁都可以透過從檔案中讀取資料來重新填充。那麼,為什麼要麻煩地將這些頁面新增到交換分割槽或交換檔案中呢?如果您再次需要該資料,您不妨從原始檔案中讀回它,而不是在交換空間中讀取冗餘副本。所以檔案頁不儲存在swap中。它們“儲存”在原始檔案中。
對於匿名頁,沒有與記憶體中的值關聯的基礎檔案。這些頁面中的值是動態到達的。你不能簡單地從檔案中讀回它們。恢復匿名頁記憶體值的唯一方法是在釋放記憶體之前將資料儲存在某個位置。這就是交換的意義。需要再次引用的匿名頁。
但請注意,對於檔案頁和匿名頁,釋放記憶體可能需要硬碟驅動器寫入。如果檔案頁資料或匿名頁資料自上次寫入檔案或交換後已更改,則需要進行檔案系統寫入。要檢索資料,需要讀取檔案系統。這兩種型別的頁面回收成本都很高。試圖透過最小化匿名頁面的交換來減少硬碟驅動器的輸入和輸出,只會增加硬碟驅動器的輸入和輸出量,這是處理寫入和讀取檔案的檔案頁面所必需的。
從上一段程式碼中可以看到,有兩個變數。一個叫file\u prio表示“檔案優先順序”,另一個叫anon\u prio表示“匿名優先順序”。
這些變數儲存的值是串聯工作的。如果兩者都設定為100,則它們相等。對於任何其他值,non\u prio將從100減少到0,file\u prio將從100增加到200。這兩個值輸入到一個複雜的演算法中,該演算法確定Linux核心執行時是優先回收(釋放)檔案頁還是匿名頁。
您可以將檔案優先權視為系統願意釋放檔案頁,而非優先權視為系統願意釋放匿名頁。這些值所不做的是為何時使用swap設定任何型別的觸發器或閾值。那是在別處決定的。
但是,當需要釋放記憶體時,回收和交換算**考慮這兩個變數及其比率,以確定優先考慮釋放哪些頁型別。這決定了關聯的硬碟活動是為檔案頁處理檔案還是為匿名頁交換空間。
我們已經確定,Linux swappeiness值為將被掃描以進行潛在回收的記憶體頁型別設定了一個首選項。這很好,但必須有一些事情來決定何時進行互換。
每個記憶區域都有一個高水位線和一個低水位線。這些是系統派生的值。它們是每個區域記憶體的百分比。正是這些值被用作交換觸發閾值。
要檢查高水位線和低水位線,請使用以下命令檢視/proc/zoneinfo檔案:
less /proc/zoneinfo每個區域都有一組以頁為單位的記憶體值。以下是測試機器上DMA32區域的值。低水位線13966頁,高水位線16759頁:
因此,您可以看到,不能使用Linux swappeiness值來影響swap在RAM使用方面的行為。只是不能這樣。
這取決於硬體、工作負載、硬碟型別,以及您的計算機是桌上型電腦還是伺服器。顯然,這不會是一個一刀切的設定型別。
您必須記住,當記憶體空間耗盡時,swap不僅僅是一種釋放RAM的機制。Swap是一個功能良好的系統的重要組成部分,沒有它,Linux就很難實現合理的記憶體管理。
更改Linux swappeiness值會立即生效;您不需要重新啟動。所以你可以做一些小的調整並監控效果。理想情況下,你可以在幾天內,在電腦上進行不同型別的活動,試圖找到最接近理想的設定。
需要考慮以下幾點:
在更改交換值之前,您需要知道它的當前值是什麼。如果你想減少一點,問題是比什麼少一點?使用此命令可以找到:
cat /proc/sys/vm/swappiness要配置交換性值,請使用sysctl命令:
sudo sysctl vm.swappiness=45直接使用新值,不需要重新啟動。
事實上,如果重新啟動,交換值將返回到其預設值60。當您完成實驗並決定要使用的新值後,您可以透過將它新增到/etc來使它在重新啟動期間保持不變/系統控制組態檔案。你可以用你喜歡的編輯器。使用以下命令使用nano編輯器編輯檔案:
sudo nano /etc/sysctl.conf當nano開啟時,滾動到檔案的底部並新增這一行。我們用35作為永久交換值。你應該替換你想要使用的值。
vm.swappiness=35要儲存更改並退出nano,請按“Ctrl+O”,按“Enter”,然後按“Ctrl+Z”
記憶體管理很複雜。這就是為什麼,對於普通使用者來說,由核心決定通常更好。
很容易讓人覺得你用的記憶體比你用的多。像top和free這樣的實用程式可能會給人錯誤的印象。Linux將使用免費的RAM來實現它自己的各種目的,比如磁碟快取。這就人為地提高了“已用”記憶體的數值,降低了“空閒”記憶體的數值。實際上,用作磁碟快取的RAM同時被標記為“已用”和“可用”,因為它可以在任何時候很快地被回收。
對於外行來說,可能看起來swap不起作用,或者swappeiss值需要更改。
和往常一樣,細節才是關鍵。或者,在本例中,是守護程序。核心交換守護程序。
...式 6. 摘要 什麼是氣孔(stomata)? 氣孔是植物葉和莖的表皮上的小孔,參與植物的氣體交換。氣孔更常見於植物葉的下表皮,以減少直接暴露在熱量和氣流中。氣孔的孔是由兩個豆狀細胞形成的,稱為保衛細胞。保衛細胞包括葉綠...
...2. 什麼是交易 3. 什麼是交換 4. 並列比較-交易與表格形式的交換 5. 摘要 什麼是交易(a transaction)? 一項交易被稱為雙方之間的合同或協議,其中一種商品或服務被交換成貨幣價值。因此,對於一項交易的發生,一方應擁有另一方...
...腦具有出色的效能、超長的電池壽命和較長的耐用性。Mac上的硬體很難匹配,這使得它成為執行Linux的強大機器。 ...
...位。 “最好的朋友”功能是做什麼的? 任天堂交換機上的“最好的朋友”狀態在一定程度上是“最喜歡”朋友的一種方式。這是一種在交換機上標記你最親密的朋友的方法,這樣他們總是出現在你朋友列表的頂部。你最好的...
...埠附近裝置底部邊緣的序列號。然後,將序列號與GBATemp上的這個執行緒交叉引用,看看它是否可以修改。有三類:未修補(可利用)、修補(不可利用)和可能修補。 如果你的屬於“可能修補”類別,你必須嘗試利用,看看它...
...。 自由命令 free命令為您提供一個表,其中列出了計算機上的總記憶體、已用記憶體、可用記憶體、共享記憶體、緩衝區/快取和可用記憶體。它還顯示配置的交換空間總量,以及已使用和可用的交換空間量。 在我們的示例中,...
...錄的元資料,包括它們在硬碟驅動器(或虛擬檔案系統)上的位置、檔案大小和檔案的時間戳。 dentry:dentry(目錄條目)是儲存目錄列表資訊的結構。可以將其視為目錄中檔案和目錄的inode列表。 您可以理解為什麼將用於緩衝...
...定:請使用Ext4。 出於某種原因,Ext4是大多數Linux發行版上的預設檔案系統。它是舊Ext3檔案系統的改進版本。它不是最先進的檔案系統,但這是好的:它意味著Ext4是堅如磐石和穩定的。 在未來,Linux發行版將逐漸轉向BtrFS。BtrFS...