linux交換空間的功能是增加主機可用的虛擬記憶體;交換空間是現代Linux系統中的第二種記憶體類型,交換空間的主要功能就是當全部的RAM被佔用並且需要更多記憶體時,用磁碟空間代替RAM記憶體。
本教學操作環境:linux5.9.8系統、Dell G3電腦。
linux交換空間有什麼用?
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 在安裝時都會建立一個交換分割區,但是也可以使用一個特殊配置的檔案作為交換檔案。交換分割區顧名思義就是一個標準磁碟分割區,由 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 GB2 倍RAM3 倍RAM2 GB - 8 GB等於RAM 大小2 倍RAM8 GB - 64 GB0.5 倍RAM1.5 倍RAM大於64 GB工作量相關不建議休眠模式
在上面列出的每個範圍之間的邊界(例如,具有2GB、8GB 或64GB 的系統RAM),請根據所選交換空間和支援休眠功能請謹慎使用。如果你的系統資源允許,增加交換空間可能會帶來更好的效能。
當然,大多數 Linux 管理員對多大的交換空間量有自己的想法。以下的表2 包含了基於我在多種環境中的個人經驗所做出的建議。這些可能不適合你,但是和表 1 一樣,它們可能對你有幫助。
表2: 作者推薦的系統交換空間
RAM 大小建議的交換空間≤ 2GB2X RAM2GB – 8GB= RAM>8GB8GB
這兩個表中共同點,隨著RAM 數量的增加,超過某一點增加更多交換空間只會導致在交換空間幾乎被全部使用之前就發生頻繁交換。根據以上建議,則應盡可能添加更多 RAM,而不是增加更多交換空間。如類似影響系統效能的情況一樣,請使用最適合你的建議。根據 Linux 環境中的條件進行測試和更改是需要時間和精力的。
面對已安裝Linux 的主機並對交換空間的需求不斷變化,有時有必要修改系統定義的交換空間的大小。此過程可用於任何需要增加交換空間大小的情況。它假設有足夠的可用磁碟空間。此程序也假設磁碟分割為 “原始的” EXT4 和交換分割區,而不是使用邏輯磁碟區管理(LVM)。
基本步驟很簡單:
/etc/fstab
。 應該不需要重新啟動機器。
為了安全起見,在關閉交換空間之前,至少你應該確保沒有應用程式在運行,也沒有交換空間在使用。 free
或 top
指令可以告訴你交換空間是否在使用中。為了更安全,您可以恢復到運行等級 1 或單一使用者模式。
使用關閉所有交換空間的命令關閉交換分割區:
swapoff -a
#現在查看硬碟上的現有分割區。
fdisk -l
這將顯示每個磁碟機上的分割區表。按編號標識目前的交換分區。
使用下列指令在互動模式下啟動 fdisk
:
fdisk /dev/<device name>
例如:
fdisk /dev/sda
此时,fdisk
是交互方式的,只在指定的磁盘驱动器上进行操作。
使用 fdisk
的 p
子命令验证磁盘上是否有足够的可用空间来创建新的交换分区。硬盘上的空间以 512 字节的块以及起始和结束柱面编号的形式显示,因此您可能需要做一些计算来确定分配分区之间和末尾的可用空间。
使用 n
子命令创建新的交换分区。fdisk
会问你开始柱面。默认情况下,它选择编号最低的可用柱面。如果你想改变这一点,输入开始柱面的编号。
fdisk
命令允许你以多种格式输入分区的大小,包括最后一个柱面号或字节、KB 或 MB 的大小。例如,键入 4000M ,这将在新分区上提供大约 4GB 的空间,然后按回车键。
使用 p
子命令来验证分区是否按照指定的方式创建的。请注意,除非使用结束柱面编号,否则分区可能与你指定的不完全相同。fdisk
命令只能在整个柱面上增量的分配磁盘空间,因此你的分区可能比你指定的稍小或稍大。如果分区不是您想要的,你可以删除它并重新创建它。
现在指定新分区是交换分区了 。子命令 t
允许你指定定分区的类型。所以输入 t
,指定分区号,当它要求十六进制分区类型时,输入 82
,这是 Linux 交换分区类型,然后按回车键。
当你对创建的分区感到满意时,使用 w
子命令将新的分区表写入磁盘。fdisk
程序将退出,并在完成修改后的分区表的编写后返回命令提示符。当 fdisk
完成写入新分区表时,会收到以下消息:
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
此时,你使用 partprobe
命令强制内核重新读取分区表,这样就不需要执行重新启动机器。
partprobe
使用命令 fdisk -l
列出分区,新交换分区应该在列出的分区中。确保新的分区类型是 “Linux swap”。
修改 /etc/fstab
文件以指向新的交换分区。如下所示:
LABEL=SWAP-sdaX swap swap defaults 0 0
其中 X
是分区号。根据新交换分区的位置,添加以下内容:
/dev/sdaY swap swap defaults 0 0
请确保使用正确的分区号。现在,可以执行创建交换分区的最后一步。使用 mkswap
命令将分区定义为交换分区。
mkswap /dev/sdaY
最后一步是使用以下命令启用交换空间:
swapon -a
你的新交换分区现在与以前存在的交换分区一起在线。您可以使用 free
或top
命令来验证这一点。
在 LVM 磁盘环境中添加交换空间
如果你的磁盘使用 LVM ,更改交换空间将相当容易。同样,假设当前交换卷所在的卷组中有可用空间。默认情况下,LVM 环境中的 Fedora Linux 在安装过程将交换分区创建为逻辑卷。您可以非常简单地增加交换卷的大小。
以下是在 LVM 环境中增加交换空间大小的步骤:
首先,让我们使用 lvs
命令(列出逻辑卷)来验证交换空间是否存在以及交换空间是否是逻辑卷。
[root@studentvm1 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home fedora_studentvm1 -wi-ao---- 2.00g
pool00 fedora_studentvm1 twi-aotz-- 2.00g 8.17 2.93
root fedora_studentvm1 Vwi-aotz-- 2.00g pool00 8.17
swap fedora_studentvm1 -wi-ao---- 8.00g
tmp fedora_studentvm1 -wi-ao---- 5.00g
usr fedora_studentvm1 -wi-ao---- 15.00g
var fedora_studentvm1 -wi-ao---- 10.00g
[root@studentvm1 ~]#
你可以看到当前的交换空间大小为 8GB。在这种情况下,我们希望将 2GB 添加到此交换卷中。首先,停止现有的交换空间。如果交换空间正在使用,终止正在运行的程序。
swapoff -a
现在增加逻辑卷的大小。
[root@studentvm1 ~]# lvextend -L +2G /dev/mapper/fedora_studentvm1-swap
Size of logical volume fedora_studentvm1/swap changed from 8.00 GiB (2048 extents) to 10.00 GiB (2560 extents).
Logical volume fedora_studentvm1/swap successfully resized.
[root@studentvm1 ~]#
运行 mkswap
命令将整个 10GB 分区变成交换空间。
[root@studentvm1 ~]# mkswap /dev/mapper/fedora_studentvm1-swap
mkswap: /dev/mapper/fedora_studentvm1-swap: warning: wiping old swap signature.
Setting up swapspace version 1, size = 10 GiB (10737414144 bytes)
no label, UUID=3cc2bee0-e746-4b66-aa2d-1ea15ef1574a
[root@studentvm1 ~]#
重新启用交换空间。
[root@studentvm1 ~]# swapon -a
[root@studentvm1 ~]#
现在,使用 lsblk
命令验证新交换空间是否存在。同样,不需要重新启动机器。
[root@studentvm1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
|-sda1 8:1 0 1G 0 part /boot
`-sda2 8:2 0 59G 0 part
|-fedora_studentvm1-pool00_tmeta 253:0 0 4M 0 lvm
| `-fedora_studentvm1-pool00-tpool 253:2 0 2G 0 lvm
| |-fedora_studentvm1-root 253:3 0 2G 0 lvm /
| `-fedora_studentvm1-pool00 253:6 0 2G 0 lvm
|-fedora_studentvm1-pool00_tdata 253:1 0 2G 0 lvm
| `-fedora_studentvm1-pool00-tpool 253:2 0 2G 0 lvm
| |-fedora_studentvm1-root 253:3 0 2G 0 lvm /
| `-fedora_studentvm1-pool00 253:6 0 2G 0 lvm
|-fedora_studentvm1-swap 253:4 0 10G 0 lvm [SWAP]
|-fedora_studentvm1-usr 253:5 0 15G 0 lvm /usr
|-fedora_studentvm1-home 253:7 0 2G 0 lvm /home
|-fedora_studentvm1-var 253:8 0 10G 0 lvm /var
`-fedora_studentvm1-tmp 253:9 0 5G 0 lvm /tmp
sr0 11:0 1 1024M 0 rom
[root@studentvm1 ~]#
您也可以使用 swapon -s
命令或 top
、free
或其他几个命令来验证这一点。
[root@studentvm1 ~]# free
total used free shared buff/cache available
Mem: 4038808 382404 2754072 4152 902332 3404184
Swap: 10485756 0 10485756
[root@studentvm1 ~]#
请注意,不同的命令以不同的形式显示或要求输入设备文件。在 /dev
目录中访问特定设备有多种方式。
推荐学习:《linux视频教程》
以上是linux交換空間有什麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!