Linux交換空間swap講解

九派Linux發表於2020-08-27

在上一篇文中,有為大家介紹Linux的物理儲存結構,以及如何利用fdisk命令來劃分分割槽,使用mkfs命令來格式化分割槽,使用mount命令來進行掛載。但是細心的朋友會發現,當我們重啟系統之後,發現新增的分割槽不見了,如果想讓這個裝置檔案的掛載永久有效,則需要把掛載的資訊寫入到配置檔案/etc/fstab中:

image

/dev/sdb1 /myFS xfs defaults 0 0

上面命令中,各列欄位的含義如下:

欄位 意義
裝置檔案 一般為裝置的路徑+裝置名稱,也可以寫唯一識別碼(UUID)
掛載目錄 指定要掛載到的目錄,需在掛載前建立好
格式型別 指定檔案系統的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此為光碟裝置)等
許可權選項 若設定為defaults,則預設許可權為:rw, suid, dev, exec, auto, nouser, async
是否備份 若為1則開機後使用dump進行磁碟備份,為0則不備份
是否自檢 若為1則開機後自動進行磁碟自檢,為0則不自檢

大家應該都知道,直接從記憶體中讀寫資料要比從硬碟讀寫資料快得多,因此有時候我們更希望所有資料的讀寫都在記憶體中完成。然而實際情況中是不可能的,因為記憶體是有限的,為了解決這一問題,就引出了實體記憶體與虛擬記憶體的概念。

交換空間swap的基本概念

實體記憶體就是系統硬體提供的記憶體大小,是真正的記憶體。相對於實體記憶體,在 Linux 下還有一個虛擬記憶體的概念,虛擬記憶體是為了滿足實體記憶體的不足而提出的策略,其設計目的是為了解決真實實體記憶體不足的問題,它是利用磁碟空間虛擬出的一塊邏輯記憶體。用作虛擬記憶體的磁碟空間被稱為交換空間(又稱 swap 空間)。

image

[虛擬記憶體和交換空間的對映關係圖]

作為實體記憶體的擴充套件,Linux 會在實體記憶體不足時,使用交換分割槽的虛擬記憶體,更詳細地說,就是核心會將暫時記憶體中暫時不常用的資料臨時存放到硬碟中,以便騰出實體記憶體空間。這樣一來,實體記憶體得到了釋放,這塊記憶體就可以用於其他目的,當需要用到原始的內容時,這些資訊會被重新從交換空間讀入實體記憶體。

但由於交換分割槽畢竟是通過硬碟裝置讀寫資料的,速度肯定要比實體記憶體慢,所以只有當真實的實體記憶體耗盡後才會呼叫交換分割槽的資源。

Linux 的記憶體管理採取的是分頁存取機制,為了保證實體記憶體能得到充分的利用,核心會在適當的時候將實體記憶體中不經常使用的資料塊自動交換到虛擬記憶體中,而將經常使用的資訊保留到實體記憶體。

當然要深入瞭解Linux的記憶體機制,我們還需要掌握以下幾點內容:

  1. Linux 系統會不時地進行頁面交換操作,以保持儘可能多的空閒實體記憶體
  2. Linux 根據“最近最經常使用”的原則,將一些不經常使用的頁面檔案交換到虛擬記憶體
  3. 交換空間的頁面在使用時會首先被交換到實體記憶體,如果此時沒有足夠的實體記憶體來容納這些頁面,它們又會被馬上交換出去,如此一來,虛擬記憶體中可能沒有足夠的空間來儲存這些交換頁面,最終會導致 Linux 出現假當機、服務異常等問題

swap 配額大小

因此,合理規劃和設計 Linux 記憶體的使用是非常重要的,關於實體記憶體和交換空間的大小設定問題,取決於實際所用的硬碟大小,我們看下redhat官方建議:

Amount of RAM in the system 實體記憶體 Recommended swap space建議的交換空間大小 Recommended swap space if allowing for hibernation如果開啟休眠功能建議的交換空間大小
⩽ 2GB 2 times the amount of RAM 3 times the amount of RAM
> 2GB – 8GB Equal to the amount of RAM 2 times the amount of RAM
> 8GB – 64GB At least 4 GB 1.5 times the amount of RAM
> 64GB At least 4 GB Hibernation not recommended

我們實際在生產環境中,交換分割槽的大小一般為真實實體記憶體的1.5~2倍。

如何新增交換分割槽

新增交換分割槽之前,我們依舊可以從/dev/sdb裝置進行分割槽,我這裡先分出4G的空間,執行操作過程入下圖:

image

從上圖可以看到,我們分出的第二個分割槽名稱是/dev/sdb2,使用SWAP分割槽專用的格式化命令mkswap,對新建的主分割槽進行格式化操作:

$ mkswap /dev/sdb2

image

為了能夠提現實驗的效果,我們先來看下目前的swap大小是多少:

$ free -m

image

使用swapon命令把準備好的SWAP分割槽裝置正式掛載到系統中。我們再使用 free -m 命令檢視交換分割槽的大小變化(由2047MB增加到6143MB):

$swapon /dev/sdb2

image

同樣,為了能夠讓新的交換分割槽裝置在系統重啟後依然生效,我們還需要將如下資訊寫入到//etc/fstab配置檔案中:

/dev/sdb2 swap swap defaults 0 0 

寫入完成之後記得儲存檔案。

image

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章