解決RAM不足問題 - 在 Linux 新增 Swap 虛擬記憶體

建立 Swap 虛擬記憶體儲存空間

一般建立 Swap 記憶體,大小通常會設定在實體記憶體的 1到 2倍。

以一台 1Gb 記憶體的主機而言,我們在這裡建立 2G的 Swap 虛擬記憶體儲存空間。

首先,在 var 透過 fallocate 建立 swapfile 資料夾,fallocate 可指定預留資料夾空間,以及權限設定為 root 可讀寫

cd /
fallocate -l 2G swapfile
chmod 600 swap-sda1

初始化 Swap 空間

首先,透過 mkswap 將 /swapfile 建立為 Linux 交換區,讓這個資料夾被分割為一個磁碟區

建立過程會自動分配一個 UUID 給這個磁碟區

(注意!執行 mkswap 會抹除交換區內的資料)

mkswap /swapfile

啟動交換區

狀況一、主機若使用一般硬碟,透過 swapon 來啟動交換區,讓 Linux 可以正常使用這個分割空間:

swapon /swapfile

狀況二、主機若使用支援TRIM的SSD硬碟 ,則可以透過 -d 或 discard 選項來提升交換區的效率

swapon -d /swapfile

啟動完成後,檢查 swap 狀態是否啟用

swapon -s

開機啟動

設定重新開機後,自動啟動 swap

一般類型磁碟

echo "/swapfile none swap sw 0 0" >> /etc/fstab"

支援TRIM的SSD磁碟

echo "/swapfile none swap sw,discard 0 0" >> /etc/fstab"

停止 swap 交換區

如果不使用,可透過以下指令終止:

sudo swapoff /swapfile

調整效能

在預設建立好的 swap ,在記憶體充足時,就會開始佔用 swap 空間。

如果想先主要以實體記憶體為主,swap 為輔,可以透過 swappiness 來設定分配方式。

首先,查看預設的 swappiness 設定

cat /proc/sys/vm/swappiness

預設通常會是 60 (值越高,表示會越優先使用 swap,範圍 0~100)

透過以下指令可修改值

sysctl vm.swappiness=10

以及設定開機自動設定

echo "vm.swappiness=10" >> /etc/sysctl.conf"

最後,檢查記憶體

free -m

若發現 Mem的 free 變很低,可以執行以下命令,手動釋放記憶體

echo 1 > /proc/sys/vm/drop_caches

問題排解

使用 CentOS 作法

如果使用 CentOS ,當執行swapon 時,出現錯誤訊息: swapon 失敗: 不適用的引數 或 swapon failed: Invalid argument,須改用dd 命令來創建 swap

dd if=/dev/zero of=/swapfile bs=1024 count=1024k

chmod 600 /swapfile

mkswap /swapfile

swapon /swapfile

swapon -s

參數說明 if 輸入文件名 of 輸出文件名 bs bytes,設置讀入/輸出大小 count blocks,僅拷貝 blocks bs