linux上的交換是什麼?(以及如何更改)

Linux swappeiness值與交換開始前使用了多少RAM無關。這是一個被廣泛報道和普遍相信的錯誤。我們解釋它到底是什麼。...

Linux swappeiness值與交換開始前使用了多少RAM無關。這是一個被廣泛報道和普遍相信的錯誤。我們解釋它到底是什麼。

破除關於世外桃源的神話

交換是一種將隨機存取儲存器(RAM)中的資料寫入硬碟上的特殊位置(交換分割槽或交換檔案)以釋放RAM的技術。

Linux有一個稱為交換值的設定。關於這個設定控制什麼,有很多困惑。對交換性最常見的錯誤描述是,它為RAM使用設定了一個閾值,當使用的RAM數量達到該閾值時,交換就開始了。

這是一個經常被重複的錯誤觀念,現在它已被接受為智慧。如果(幾乎)其他人都告訴你交換就是這樣工作的,為什麼你要相信我們說不是這樣的呢?

很簡單。我們要證明這一點。

你的公羊被分成幾個區域

Linux不認為RAM是一個大的同質記憶體池。它認為它被劃分為若干不同的區域,稱為區域。計算機上存在哪些區域取決於它是32位還是64位。下面是x86體系結構計算機上可能的區域的簡化描述。

  • 直接記憶體訪問(DMA):這是低16 MB的記憶體。這個區域之所以得名是因為,很久以前,有一些計算機只能直接訪問這個實體記憶體區域。
  • 直接記憶體訪問32:儘管有它的名字,直接記憶體訪問32(DMA32)是一個只有在64位Linux中才能找到的區域。記憶體不足4GB。執行在32位計算機上的Linux只能對這個數量的RAM執行DMA(除非它們使用的是實體地址擴充套件(PAE)核心),這就是區域的名稱。不過,在32位計算機上,它被稱為HighMem。
  • 正常:在64位計算機上,正常記憶體是4GB以上的所有RAM(大約)。在32位機器上,它的RAM介於16 MB和896 MB之間。
  • HighMem:這隻存在於32位Linux計算機上。它的所有RAM都在896MB以上,包括足夠大的機器上4GB以上的RAM。

pagesize值

RAM以固定大小的頁面分配。這個大小是由核心在引導時透過檢測計算機的體系結構來確定的。通常,Linux計算機上的頁面大小是4KB。

可以使用getconf命令檢視頁面大小:

getconf PAGESIZE

linux上的交換是什麼?(以及如何更改)

分割槽附著到節點

分割槽附著到節點。節點與中央處理器(CPU)相關聯。核心將嘗試從與CPU相關聯的節點為CPU上執行的程序分配記憶體。

將節點繫結到CPU的概念允許在專業多CPU計算機中安裝混合記憶體型別,使用非統一記憶體訪問體系結構。

這些都是非常高階的。一般的Linux計算機只有一個節點,稱為node zero。所有區域都將屬於該節點。要檢視計算機中的節點和區域,請檢視/proc/buddyinfo檔案。我們將使用更少的資源:

less /proc/buddyinfo

linux上的交換是什麼?(以及如何更改)

這是本文研究的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區域,從左側讀取:

  • 2:記憶體塊有2個,共2個^(0*PAGESIZE)。
  • 67:有67個2^(1*頁大小)記憶體塊。
  • 58:有58個2^(2*PAGESIZE)記憶體塊可用。
  • 等等,一直到…
  • 17:有17個2^(512*PAGESIZE)塊。

但實際上,我們檢視這些資訊的唯一原因是檢視節點和區域之間的關係。

檔案頁和匿名頁

記憶體對映使用頁表條目集來記錄哪些記憶體頁被使用,以及用於什麼目的。

記憶體對映可以是:

  • 檔案備份:檔案備份對映包含已從檔案中讀取的資料。它可以是任何型別的檔案。需要注意的重要一點是,如果系統釋放了這個記憶體,並且需要再次獲取該資料,則可以再次從檔案中讀取該資料。但是,如果資料在記憶體中發生了更改,則需要將這些更改寫入硬碟上的檔案,然後才能釋放記憶體。如果沒有發生這種情況,這些變化就會消失。
  • 匿名:匿名記憶體是一個沒有檔案或裝置支援的記憶體對映。這些頁可能包含程式動態請求的記憶體,用於儲存資料,或用於堆疊和堆之類的內容。因為這種型別的資料後面沒有檔案,所以必須留出一個特殊的位置來儲存匿名資料。該位置是交換分割槽或交換檔案。在釋放匿名頁之前,將匿名資料寫入交換。
  • 裝置備份:透過塊裝置檔案對裝置進行定址,這些檔案可以被視為檔案。資料可以從中讀取和寫入。裝置支援的記憶體對映包含儲存在其中的裝置的資料。
  • 共享:多個頁表條目可以對映到RAM的同一頁。透過任何對映訪問記憶體位置都將顯示相同的資料。透過改變這些共同監視的記憶體位置中的資料,不同的程序可以非常有效地相互通訊。共享可寫對映是實現高效能程序間通訊的常用方法。
  • 寫時複製:寫時複製是一種延遲分配技術。如果請求已在記憶體中的資源的副本,則透過返回到原始資源的對映來滿足請求。如果“共享”資源的某個程序試圖寫入該資源,則必須在記憶體中真正複製該資源,以便對新副本進行更改。因此,記憶體分配只在第一個寫命令時進行。

對於交換,我們只需要關注列表中的前兩個:檔案頁和匿名頁。

交換

以下是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表示“匿名優先順序”。

  • anonèprio變數被設定為Linux交換值。
  • “檔案優先順序”值設定為200減去“非優先順序”值。

這些變數儲存的值是串聯工作的。如果兩者都設定為100,則它們相等。對於任何其他值,non\u prio將從100減少到0,file\u prio將從100增加到200。這兩個值輸入到一個複雜的演算法中,該演算法確定Linux核心執行時是優先回收(釋放)檔案頁還是匿名頁。

您可以將檔案優先權視為系統願意釋放檔案頁,而非優先權視為系統願意釋放匿名頁。這些值所不做的是為何時使用swap設定任何型別的觸發器或閾值。那是在別處決定的。

但是,當需要釋放記憶體時,回收和交換算**考慮這兩個變數及其比率,以確定優先考慮釋放哪些頁型別。這決定了關聯的硬碟活動是為檔案頁處理檔案還是為匿名頁交換空間。

交換什麼時候開始?

我們已經確定,Linux swappeiness值為將被掃描以進行潛在回收的記憶體頁型別設定了一個首選項。這很好,但必須有一些事情來決定何時進行互換。

每個記憶區域都有一個高水位線和一個低水位線。這些是系統派生的值。它們是每個區域記憶體的百分比。正是這些值被用作交換觸發閾值。

要檢查高水位線和低水位線,請使用以下命令檢視/proc/zoneinfo檔案:

less /proc/zoneinfo

linux上的交換是什麼?(以及如何更改)

每個區域都有一組以頁為單位的記憶體值。以下是測試機器上DMA32區域的值。低水位線13966頁,高水位線16759頁:

linux上的交換是什麼?(以及如何更改)

  • 在正常執行條件下,當區域中的可用記憶體降至該區域的低水位線以下時,swap演算法開始掃描記憶體頁,尋找可以回收的記憶體,同時考慮anon\u prio和file\u prio的相對值。
  • 如果Linux swappiness值設定為零,則當檔案頁和空閒頁的組合值小於高水位線時,將發生交換。

因此,您可以看到,不能使用Linux swappeiness值來影響swap在RAM使用方面的行為。只是不能這樣。

swapiness應該設定為什麼?

這取決於硬體、工作負載、硬碟型別,以及您的計算機是桌上型電腦還是伺服器。顯然,這不會是一個一刀切的設定型別。

您必須記住,當記憶體空間耗盡時,swap不僅僅是一種釋放RAM的機制。Swap是一個功能良好的系統的重要組成部分,沒有它,Linux就很難實現合理的記憶體管理。

更改Linux swappeiness值會立即生效;您不需要重新啟動。所以你可以做一些小的調整並監控效果。理想情況下,你可以在幾天內,在電腦上進行不同型別的活動,試圖找到最接近理想的設定。

需要考慮以下幾點:

  • 嘗試透過將Linux swappeiness值設定為零來“禁用交換”只會將交換關聯的硬碟驅動器活動轉換為檔案關聯的硬碟驅動器活動。
  • 如果您有老化的機械硬碟,您可以嘗試降低Linux的swappiness值,以避免匿名頁面回收,並減少交換分割槽的變動。當然,當你調低一個設定時,另一個設定就會增加。減少交換流失可能會增加檔案系統流失。但是你的電腦可能更喜歡一種方法而不是另一種方法。真的,唯一確定的方法就是試試看。
  • 對於單用途伺服器(如資料庫伺服器),您可以從資料庫軟體供應商處獲得指導。通常,這些應用程式都有自己專門設計的檔案快取和記憶體管理例程,您最好依賴這些例程。軟體供應商可能會根據機器規格和工作負載建議Linux交換值。
  • 對於擁有最新硬體的普通桌面使用者來說?保持原樣。

如何設定linux交換值

在更改交換值之前,您需要知道它的當前值是什麼。如果你想減少一點,問題是比什麼少一點?使用此命令可以找到:

cat /proc/sys/vm/swappiness

linux上的交換是什麼?(以及如何更改)

要配置交換性值,請使用sysctl命令:

sudo sysctl vm.swappiness=45

linux上的交換是什麼?(以及如何更改)

直接使用新值,不需要重新啟動。

事實上,如果重新啟動,交換值將返回到其預設值60。當您完成實驗並決定要使用的新值後,您可以透過將它新增到/etc來使它在重新啟動期間保持不變/系統控制組態檔案。你可以用你喜歡的編輯器。使用以下命令使用nano編輯器編輯檔案:

sudo nano /etc/sysctl.conf

linux上的交換是什麼?(以及如何更改)

當nano開啟時,滾動到檔案的底部並新增這一行。我們用35作為永久交換值。你應該替換你想要使用的值。

vm.swappiness=35

linux上的交換是什麼?(以及如何更改)

要儲存更改並退出nano,請按“Ctrl+O”,按“Enter”,然後按“Ctrl+Z”

記憶體管理很複雜

記憶體管理很複雜。這就是為什麼,對於普通使用者來說,由核心決定通常更好。

很容易讓人覺得你用的記憶體比你用的多。像top和free這樣的實用程式可能會給人錯誤的印象。Linux將使用免費的RAM來實現它自己的各種目的,比如磁碟快取。這就人為地提高了“已用”記憶體的數值,降低了“空閒”記憶體的數值。實際上,用作磁碟快取的RAM同時被標記為“已用”和“可用”,因為它可以在任何時候很快地被回收。

對於外行來說,可能看起來swap不起作用,或者swappeiss值需要更改。

和往常一樣,細節才是關鍵。或者,在本例中,是守護程序。核心交換守護程序。

  • 發表於 2021-04-02 20:43
  • 閱讀 ( 53 )
  • 分類:網際網路

你可能感興趣的文章

氣孔(stomata)和皮孔(lenticels)的區別

...式 6. 摘要 什麼是氣孔(stomata)? 氣孔是植物葉和莖的表皮上的小孔,參與植物的氣體交換。氣孔更常見於植物葉的下表皮,以減少直接暴露在熱量和氣流中。氣孔的孔是由兩個豆狀細胞形成的,稱為保衛細胞。保衛細胞包括葉綠...

  • 發佈於 2020-10-19 23:30
  • 閲讀 ( 60 )

交易(transaction)和交換(exchange)的區別

...2. 什麼是交易 3. 什麼是交換 4. 並列比較-交易與表格形式的交換 5. 摘要 什麼是交易(a transaction)? 一項交易被稱為雙方之間的合同或協議,其中一種商品或服務被交換成貨幣價值。因此,對於一項交易的發生,一方應擁有另一方...

  • 發佈於 2020-10-25 03:22
  • 閲讀 ( 176 )

如何在mac上安裝和雙引導linux

...腦具有出色的效能、超長的電池壽命和較長的耐用性。Mac上的硬體很難匹配,這使得它成為執行Linux的強大機器。 ...

  • 發佈於 2021-03-18 04:03
  • 閲讀 ( 59 )

如何更改linux密碼

...統使用者名稱是什麼,可以使用以下命令查詢,列出系統上的所有使用者帳戶: ...

  • 發佈於 2021-03-28 02:28
  • 閲讀 ( 42 )

4種方式分享任天堂開關媒體到您的手機或電腦

... 如果您想訪問**上的交換媒體,可以生成二維碼,以便在裝置之間輕鬆連線和傳送。 ...

  • 發佈於 2021-03-28 17:27
  • 閲讀 ( 45 )

任天堂交換機上的“好朋友”是什麼?

...位。 “最好的朋友”功能是做什麼的? 任天堂交換機上的“最好的朋友”狀態在一定程度上是“最喜歡”朋友的一種方式。這是一種在交換機上標記你最親密的朋友的方法,這樣他們總是出現在你朋友列表的頂部。你最好的...

  • 發佈於 2021-03-31 21:15
  • 閲讀 ( 33 )

你需要知道的關於任天堂交換機的一切

...埠附近裝置底部邊緣的序列號。然後,將序列號與GBATemp上的這個執行緒交叉引用,看看它是否可以修改。有三類:未修補(可利用)、修補(不可利用)和可能修補。 如果你的屬於“可能修補”類別,你必須嘗試利用,看看它...

  • 發佈於 2021-04-02 03:39
  • 閲讀 ( 43 )

如何從linux終端檢查記憶體使用情況

...。 自由命令 free命令為您提供一個表,其中列出了計算機上的總記憶體、已用記憶體、可用記憶體、共享記憶體、緩衝區/快取和可用記憶體。它還顯示配置的交換空間總量,以及已使用和可用的交換空間量。 在我們的示例中,...

  • 發佈於 2021-04-02 13:03
  • 閲讀 ( 50 )

如何在linux上使用free命令

...錄的元資料,包括它們在硬碟驅動器(或虛擬檔案系統)上的位置、檔案大小和檔案的時間戳。 dentry:dentry(目錄條目)是儲存目錄列表資訊的結構。可以將其視為目錄中檔案和目錄的inode列表。 您可以理解為什麼將用於緩衝...

  • 發佈於 2021-04-02 19:12
  • 閲讀 ( 47 )

您應該使用哪個linux檔案系統?

...定:請使用Ext4。 出於某種原因,Ext4是大多數Linux發行版上的預設檔案系統。它是舊Ext3檔案系統的改進版本。它不是最先進的檔案系統,但這是好的:它意味著Ext4是堅如磐石和穩定的。 在未來,Linux發行版將逐漸轉向BtrFS。BtrFS...

  • 發佈於 2021-04-08 06:35
  • 閲讀 ( 51 )
xjdx7775
xjdx7775

0 篇文章

作家榜

  1. admin 0 文章
  2. 孫小欽 0 文章
  3. JVhby0 0 文章
  4. fvpvzrr 0 文章
  5. 0sus8kksc 0 文章
  6. zsfn1903 0 文章
  7. w91395898 0 文章
  8. SuperQueen123 0 文章

相關推薦