Linux 系統上交換空間的介紹
學習如何修改你的系統上的交換空間的容量,以及你到底需要多大的交換空間。
當今無論什麼作業系統交換Swap空間是非常常見的。Linux 使用交換空間來增加主機可用的虛擬記憶體。它可以在常規檔案或邏輯捲上使用一個或多個專用交換分割槽或交換檔案。
典型計算機中有兩種基本型別的記憶體。第一種型別,隨機存取儲存器 (RAM),用於儲存計算機使用的資料和程式。只有程式和資料儲存在 RAM 中,計算機才能使用它們。隨機儲存器是易失性儲存器;也就是說,如果計算機關閉了,儲存在 RAM 中的資料就會丟失。
硬碟是用於長期儲存資料和程式的磁性介質。該磁介質可以很好的儲存資料;即使計算機斷電,儲存在磁碟上的資料也會保留下來。CPU(中央處理器)不能直接訪問硬碟上的程式和資料;它們必須首先複製到 RAM 中,RAM 是 CPU 訪問程式碼指令和操作資料的地方。在引導過程中,計算機將特定的作業系統程式(如核心、init 或 systemd)以及硬碟上的資料複製到 RAM 中,在 RAM 中,計算機的處理器 CPU 可以直接訪問這些資料。
交換空間
交換空間是現代 Linux 系統中的第二種記憶體型別。交換空間的主要功能是當全部的 RAM 被佔用並且需要更多記憶體時,用磁碟空間代替 RAM 記憶體。
例如,假設你有一個 8GB RAM 的計算機。如果你啟動的程式沒有填滿 RAM,一切都好,不需要交換。假設你在處理電子表格,當新增更多的行時,你電子表格會增長,加上所有正在執行的程式,將會佔用全部的 RAM 。如果這時沒有可用的交換空間,你將不得不停止處理電子表格,直到關閉一些其他程式來釋放一些 RAM 。
核心使用一個記憶體管理程式來檢測最近沒有使用的記憶體塊(記憶體頁)。記憶體管理程式將這些相對不經常使用的記憶體頁交換到硬碟上專門指定用於“分頁”或交換的特殊分割槽。這會釋放 RAM,為輸入電子表格更多資料騰出了空間。那些換出到硬碟的記憶體頁面被核心的記憶體管理程式碼跟蹤,如果需要,可以被分頁回 RAM。
Linux 計算機中的記憶體總量是 RAM + 交換分割槽,交換分割槽被稱為虛擬記憶體.
Linux 交換分割槽型別
Linux 提供了兩種型別的交換空間。預設情況下,大多數 Linux 在安裝時都會建立一個交換分割槽,但是也可以使用一個特殊配置的檔案作為交換檔案。交換分割槽顧名思義就是一個標準磁碟分割槽,由 mkswap
命令指定交換空間。
如果沒有可用磁碟空間來建立新的交換分割槽,或者卷組中沒有空間為交換空間建立邏輯卷,則可以使用交換檔案。這只是一個建立好並預分配指定大小的常規檔案。然後執行 mkswap
命令將其配置為交換空間。除非絕對必要,否則我不建議使用檔案來做交換空間。(LCTT 譯註:Ubuntu 近來的版本採用了交換檔案而非交換空間,所以我對於這種說法保留看法)
頻繁交換
當總虛擬記憶體(RAM 和交換空間)變得快滿時,可能會發生頻繁交換。系統花了太多時間在交換空間和 RAM 之間做記憶體塊的頁面切換,以至於幾乎沒有時間用於實際工作。這種情況的典型症狀是:系統變得緩慢或完全無反應,硬碟指示燈幾乎持續亮起。
使用 free
的命令來顯示 CPU 負載和記憶體使用情況,你會發現 CPU 負載非常高,可能達到系統中 CPU 核心數量的 30 到 40 倍。另一個情況是 RAM 和交換空間幾乎完全被分配了。
事實上,檢視 SAR(系統活動報告)資料也可以顯示這些內容。在我的每個系統上都安裝 SAR ,並將這些用於資料分析。
交換空間的正確大小是多少?
許多年前,硬碟上分配給交換空間大小是計算機上的 RAM 的兩倍(當然,這是大多數計算機的 RAM 以 KB 或 MB 為單位的時候)。因此,如果一臺計算機有 64KB 的 RAM,應該分配 128KB 的交換分割槽。該規則考慮到了這樣的事實情況,即 RAM 大小在當時非常小,分配超過 2 倍的 RAM 用於交換空間並不能提高效能。使用超過兩倍的 RAM 進行交換,比實際執行有用的工作的時候,大多數系統將花費更多的時間。
RAM 現在已經很便宜了,如今大多數計算機的 RAM 都達到了幾十億位元組。我的大多數新電腦至少有 8GB 記憶體,一臺有 32GB 記憶體,我的主工作站有 64GB 記憶體。我的舊電腦有 4 到 8GB 的記憶體。
當操作具有大量 RAM 的計算機時,交換空間的限制性能係數遠低於 2 倍。Fedora 28 線上安裝指南 定義了當前關於交換空間分配的方法。下面內容是我提出的建議。
下表根據系統中的 RAM 大小以及是否有足夠的記憶體讓系統休眠,提供了交換分割槽的推薦大小。建議的交換分割槽大小是在安裝過程中自動建立的。但是,為了滿足系統休眠,您需要在自定義分割槽階段編輯交換空間。
表 1: Fedora 28 文件中推薦的系統交換空間
系統記憶體大小 | 推薦的交換空間 | 推薦的交換空間大小(支援休眠模式) |
---|---|---|
小於 2 GB | 2 倍 RAM | 3 倍 RAM |
2 GB – 8 GB | 等於 RAM 大小 | 2 倍 RAM |
8 GB – 64 GB | 0.5 倍 RAM | 1.5 倍 RAM |
大於 64 GB | 工作量相關 | 不建議休眠模式 |
在上面列出的每個範圍之間的邊界(例如,具有 2GB、8GB 或 64GB 的系統 RAM),請根據所選交換空間和支援休眠功能請謹慎使用。如果你的系統資源允許,增加交換空間可能會帶來更好的效能。
當然,大多數 Linux 管理員對多大的交換空間量有自己的想法。下面的表2 包含了基於我在多種環境中的個人經歷所做出的建議。這些可能不適合你,但是和表 1 一樣,它們可能對你有所幫助。
表 2: 作者推薦的系統交換空間
RAM 大小 | 推薦的交換空間 |
---|---|
≤ 2GB | 2X RAM |
2GB – 8GB | = RAM |
>8GB | 8GB |
這兩個表中共同點,隨著 RAM 數量的增加,超過某一點增加更多交換空間只會導致在交換空間幾乎被全部使用之前就發生頻繁交換。根據以上建議,則應儘可能新增更多 RAM,而不是增加更多交換空間。如類似影響系統性能的情況一樣,請使用最適合你的建議。根據 Linux 環境中的條件進行測試和更改是需要時間和精力的。
向非 LVM 磁碟環境新增更多交換空間
面對已安裝 Linux 的主機並對交換空間的需求不斷變化,有時有必要修改系統定義的交換空間的大小。此過程可用於需要增加交換空間大小的任何情況。它假設有足夠的可用磁碟空間。此過程還假設磁碟分割槽為 “原始的” EXT4 和交換分割槽,而不是使用邏輯卷管理(LVM)。
基本步驟很簡單:
- 關閉現有的交換空間。
- 建立所需大小的新交換分割槽。
- 重讀分割槽表。
- 將分割槽配置為交換空間。
- 新增新分割槽到
/etc/fstab
。 - 開啟交換空間。
應該不需要重新啟動機器。
為了安全起見,在關閉交換空間前,至少你應該確保沒有應用程式在執行,也沒有交換空間在使用。free
或 top
命令可以告訴你交換空間是否在使用中。為了更安全,您可以恢復到執行級別 1 或單使用者模式。
使用關閉所有交換空間的命令關閉交換分割槽:
1 | swapoff-a |
現在檢視硬碟上的現有分割槽。
1 | fdisk-l |
這將顯示每個驅動器上的分割槽表。按編號標識當前的交換分割槽。
使用以下命令在互動模式下啟動 fdisk
:
1 | fdisk/dev/<device name> |
例如:
1 | fdisk/dev/sda |
此時,fdisk
是互動方式的,只在指定的磁碟驅動器上進行操作。
使用 fdisk
的 p
子命令驗證磁碟上是否有足夠的可用空間來建立新的交換分割槽。硬碟上的空間以 512 位元組的塊以及起始和結束柱面編號的形式顯示,因此您可能需要做一些計算來確定分配分割槽之間和末尾的可用空間。
使用 n
子命令建立新的交換分割槽。fdisk
會問你開始柱面。預設情況下,它選擇編號最低的可用柱面。如果你想改變這一點,輸入開始柱面的編號。
fdisk
命令允許你以多種格式輸入分割槽的大小,包括最後一個柱面號或位元組、KB 或 MB 的大小。例如,鍵入 4000M ,這將在新分割槽上提供大約 4GB 的空間,然後按回車鍵。
使用 p
子命令來驗證分割槽是否按照指定的方式建立的。請注意,除非使用結束柱面編號,否則分割槽可能與你指定的不完全相同。fdisk
命令只能在整個柱面上增量的分配磁碟空間,因此你的分割槽可能比你指定的稍小或稍大。如果分割槽不是您想要的,你可以刪除它並重新建立它。
現在指定新分割槽是交換分割槽了 。子命令 t
允許你指定定分割槽的型別。所以輸入 t
,指定分割槽號,當它要求十六進位制分割槽型別時,輸入 82
,這是 Linux 交換分割槽型別,然後按回車鍵。
當你對建立的分割槽感到滿意時,使用 w
子命令將新的分割槽表寫入磁碟。fdisk
程式將退出,並在完成修改後的分割槽表的編寫後返回命令提示符。當 fdisk
完成寫入新分割槽表時,會收到以下訊息:
123456 | The partition table has been altered!Calling ioctl()tore-read partition table.WARNING:Re-reading the partition table failed with error16:Device orresource busy.The kernel still uses the old table.The newtable will be used at the next reboot.Syncing disks. |
此時,你使用 partprobe
命令強制核心重新讀取分割槽表,這樣就不需要執行重新啟動機器。
1 | partprobe |
使用命令 fdisk -l
列出分割槽,新交換分割槽應該在列出的分割槽中。確保新的分割槽型別是 “Linux swap”。
修改 /etc/fstab
檔案以指向新的交換分割槽。如下所示:
1 | LABEL=SWAP-sdaX swap swap defaults 00 |
其中 X
是分割槽號。根據新交換分割槽的位置,新增以下內容:
1 | /dev/sdaY swap swap defaults 00 |
請確保使用正確的分割槽號。現在,可以執行建立交換分割槽的最後一步。使用 mkswap
命令將分割槽定義為交換分割槽。
1 | mkswap/dev/sdaY |
最後一步是使用以下命令啟用交換空間:
1 | swapon-a |
你的新交換分割槽現在與以前存在的交換分割槽一起線上。您可以使用 free
或top
命令來驗證這一點。
在 LVM 磁碟環境中新增交換空間
如果你的磁碟使用 LVM ,更改交換空間將相當容易。同樣,假設當前交換卷所在的卷組中有可用空間。預設情況下,LVM 環境中的 Fedora Linux 在安裝過程將交換分割槽建立為邏輯卷。您可以非常簡單地增加交換卷的大小。
以下是在 LVM 環境中增加交換空間大小的步驟:
- 關閉所有交換空間。
- 增加指定用於交換空間的邏輯卷的大小。
- 為交換空間調整大小的卷配置。
- 啟用交換空間。
首先,讓我們使用 lvs
命令(列出邏輯卷)來驗證交換空間是否存在以及交換空間是否是邏輯卷。
12345678910 | [root@studentvm1~]# lvsLV VG Attr LSize Pool Origin Data%Meta%Move Log Cpy%Sync Converthome fedora_studentvm1-wi-ao----2.00gpool00 fedora_studentvm1 twi-aotz--2.00g8.172.93root fedora_studentvm1 Vwi-aotz--2.00gpool008.17swap fedora_studentvm1-wi-ao----8.00gtmp fedora_studentvm1-wi-ao----5.00gusr fedora_studentvm1-wi-ao----15.00gvarfedora_studentvm1-wi-ao----10.00g[root@studentvm1~]# |
你可以看到當前的交換空間大小為 8GB。在這種情況下,我們希望將 2GB 新增到此交換卷中。首先,停止現有的交換空間。如果交換空間正在使用,終止正在執行的程式。
1 | swapoff-a |
現在增加邏輯卷的大小。
1234 | [root@studentvm1~]# lvextend -L +2G /dev/mapper/fedora_studentvm1-swap Size of logical volume fedora_studentvm1/swap changed from8.00GiB(2048extents)to10.00GiB(2560extents). Logical volume fedora_studentvm1/swap successfully resized.[root@studentvm1~]# |
執行 mkswap
命令將整個 10GB 分割槽變成交換空間。
12345 | [root@studentvm1~]# mkswap /dev/mapper/fedora_studentvm1-swapmkswap:/dev/mapper/fedora_studentvm1-swap:warning:wiping old swap signature.Setting up swapspace version1,size=10GiB(10737414144bytes)no label,UUID=3cc2bee0-e746-4b66-aa2d-1ea15ef1574a[root@studentvm1~]# |
重新啟用交換空間。
12 | [root@studentvm1~]# swapon -a[root@studentvm1~]# |
現在,使用 lsblk
命令驗證新交換空間是否存在。同樣,不需要重新啟動機器。
1234567891011121314151617181920 | [root@studentvm1~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 60G 0disk|-sda1 8:1 0 1G 0part/boot`-sda2 8:2 0 59G 0part |-fedora_studentvm1-pool00_tmeta 253:0 0 4M 0lvm |`-fedora_studentvm1-pool00-tpool253:2 0 2G 0lvm | |-fedora_studentvm1-root 253:3 0 2G 0lvm / | `-fedora_studentvm1-pool00 253:6 0 2G 0lvm |-fedora_studentvm1-pool00_tdata 253:1 0 2G 0lvm |`-fedora_studentvm1-pool00-tpool253:2 0 2G 0lvm | |-fedora_studentvm1-root 253:3 0 2G 0lvm / | `-fedora_studentvm1-pool00 253:6 0 2G 0lvm |-fedora_studentvm1-swap 253:4 0 10G 0lvm [SWAP] |-fedora_studentvm1-usr 253:5 0 15G 0lvm /usr |-fedora_studentvm1-home 253:7 0 2G 0lvm /home |-fedora_studentvm1-var 253:8 0 10G 0lvm /var `-fedora_studentvm1-tmp 253:9 0 5G 0lvm /tmpsr0 11:0 11024M 0rom [root@studentvm1~]# |
您也可以使用 swapon -s
命令或 top
、free
或其他幾個命令來驗證這一點。
12345 | [root@studentvm1~]# free total used free shared buff/cache available |