深入理解 Linux 上的虛擬內存
虛擬內存可幫助操作系統在不中斷的情況下執行其進程。虛擬內存是現代操作系統的基礎之一,但通常情況下,除非遇到問題,否則您也可能不會真正考慮它。Linux 發行版要求您在安裝期間設置虛擬內存空間(交換分區),但大多數初學者并不知道這有多大用處。
以下是您需要了解的有關 Linux 上的虛擬內存的所有信息。
什么是虛擬內存?
虛擬內存是從機器物理內存中提取出來的一種表示內存的方式。它利用了你的 RAM 和你的存儲空間,無論是在傳統的硬盤驅動器還是 SSD 上。
在 Linux 中,這是在內核和硬件級別完成的。CPU 有一個稱為內存管理單元 (MMU) 的硬件,它將物理內存地址轉換為虛擬內存地址。這些地址與它們在機器上的物理位置無關。這些地址空間被稱為“頁面”,它們可能位于 RAM 中,也可能位于您的硬盤驅動器或 SSD 中。操作系統將這些地址視為一個大內存池,稱為“地址空間”。
虛擬內存利用了這樣一個事實,即理論上并非所有正在使用的內存都一直在使用。內存中的程序被分解成頁面,內核認為不必要的部分被“換出”或移動到硬盤驅動器。當需要它們時,可以將它們“換入”或帶回 RAM。
驅動器上用于虛擬內存的空間稱為“后備存儲”或“交換空間”。在 Windows 世界中,它通常被實現為一個文件,稱為“交換文件”。在 Linux 中也可以這樣做,但使用專用磁盤分區更為常見。
Linux 上的交換文件通常保留給最小系統或嵌入式系統,后者通常在完全沒有虛擬內存的情況下運行,因為嵌入式操作系統必須很小。
虛擬內存的結果是,可以通過使用比機器中的物理 RAM 更多的內存來運行大型程序,類似于信用卡可以讓您以比銀行賬戶中更多的錢進行大宗購買。就像信用卡一樣,虛擬內存在您需要時很有用,但您不想過度使用它。
虛擬內存還允許開發人員創建應用程序,而不必知道計算機的內存是如何組織的。
歷史上虛擬內存的主要缺點是硬盤驅動器比 RAM 慢。如果一臺機器沒有足夠的 RAM,系統可以無休止地交換頁面,這個過程被稱為“抖動”。在具有更多 RAM 和更快 SSD 取代機械硬盤驅動器的現代 PC 上,這不是問題,但仍然需要注意。
Linux 交換分區
如前所述,在 Linux 上設置虛擬內存的常用方法是使用專用磁盤分區。安裝實用程序將檢查您的硬件并提出一個包含交換分區的分區方案。
您還可以在安裝后添加交換分區。如果要向現有驅動器添加新分區,則必須使用 GParted 等非破壞性分區工具。確保您已選擇“Linux swap”作為分區的文件系統。
在重新分區驅動器之前備份重要數據。
創建分區后,使用 mkswap 命令格式化分區:
sudo mkswap /dev/sdX
現在您必須以 root 身份編輯您的/etc/fstab以添加您的交換分區。添加到文件中的這一行將設置一個在引導時掛載的交換分區:
/dev/sdX none swap defaults 0 0
現在使用swapon命令激活新的交換空間,其中 sdX 是交換分區的名稱:
sudo swapon /dev/sdX
在 Linux 上使用交換文件
使用命令行在Linux 中設置交換文件很容易。如果您不想費心重新分區驅動器,可能想要編輯/etc/fstab 。一種方法是使用fallocate:
例如,要創建一個 2GB 的交換文件:
sudo fallocate -l 2G /path/to/swapfile
作為替代方案,您可以使用 dd 命令創建交換文件:
sudo dd if=/dev/zero of=/path/to/swapfile bs=1024 count=2048
確保正確使用 dd 命令,因為輸入文件和輸出文件錯誤會導致數據丟失。出于這個原因, fallocate 是首選方法。
/dev/zero 設備是輸出“0”的特殊設備。此 dd 命令所做的是使用適合用作交換空間的 1024 KB 塊創建一個空白的 2 GB 塊文件。
然后,您可以像使用交換分區一樣對交換文件使用mkswap和swapon命令:
sudo mkswap /path/to/swapfile
sudo swapon /path/to/swapfile
您可能想知道何時應該為您的交換空間使用交換文件或專用分區。選擇很簡單:在大多數情況下,您應該使用分區。這是 Linux 桌面或服務器的最佳選擇。安裝程序建議的分區方案通常適用于單用戶 Linux 桌面。
如果您在虛擬機、小型嵌入式系統上運行 Linux,或者您只是不想對現有 Linux 系統進行重新分區,則可能需要使用交換文件。
多少交換空間?
多年來,需要多少交換空間的標準建議是物理 RAM 的兩倍。即使是最便宜的 PC 也配備大容量驅動器和大量內存,這條規則可能會受到質疑。
在許多系統上,如果您檢查 top 或 htop,您甚至可能會注意到如果您以這種方式設置系統,您的交換空間甚至根本沒有被使用。
盡管如此,如果您對內存提出更高的要求,兩倍的物理內存是一個很好的起點和保險政策。您可以根據需要對系統進行更改。如果您的系統正在使用所有 RAM,則計算機在使用虛擬內存時可能會遇到性能問題。
如今,這已經不是什么大問題了,因為即使是最便宜的 PC 上的 RAM 量也綽綽有余,而且 SSD 的速度也比舊硬盤快得多。這仍然是您應該注意的事情。
解決此問題的最簡單方法是向您的計算機添加更多 RAM。如果這不可行,您可以嘗試調整 Linux 內核的“swappiness”。
swappiness 數字決定了內核在虛擬內存中的投入量。它的范圍從 0 到 100。將其設置為 0 意味著 Linux 根本不會交換,而在 100 時,它會隨時交換。大多數系統的默認值為 60。
要臨時更改 swappiness,請使用 sysctl 命令:
sudo sysctl vm.swappiness=20
該命令中的“20”將是交換編號,直到您重新啟動。要永久更改它,請以 root 身份編輯/etc/sysctl.conf文件并放置“vm.swappiness=[swappiness number]”行,其中“[swappiness number]”是您想要的 swappiness 編號。在您可以安裝更多 RAM 之前,這將是一個權宜之計。
虛擬內存讓您的 Linux 系統平穩運行
虛擬內存是現代操作系統(包括 Linux)的一個組件,可讓您的計算機平穩運行。您可以使用交換文件,但通常的方法是專用分區。您不必考慮太多,但 Linux 交換分區和交換文件很容易設置和排除故障。
很多這樣的建議也適用于其他系統,包括 Windows,即使設置虛擬內存的方法不同。