與我們合作
我們專注:網站策劃設計、網絡輿論監控、網站優化及網站營銷、品牌策略與設計
主營業務:網站建設、移動端微信小程序開發、APP開發、網絡運營、云產品·運維解決方案
有一個品牌項目想和我們談談嗎?
您可以填寫右邊的表格,讓我們了解您的項目需求,這是一個良好的開始,我們將會盡快與您取得聯系。當然也歡迎您給我們寫信或是打電話,讓我們聽到您的聲音
您也可通過下列途徑與我們取得聯系:
地 址: 上海市長寧區華寧國際7L
電 話: 400-825-2717(咨詢專線)
電 話: 13054973230(售后客戶服務)
網 址: http://www.586918.cn
傳 真: 021-61488448
郵 箱: [email protected]
快速提交您的需求 ↓
【Linux內核】另一種增大內存的方法——適合CPU性能過剩但RAM少,硬盤讀寫不佳(或容量小)的機器
發布日期:2024-02-23 瀏覽次數:35406
前言
之前在玩幻獸帕魯,自己用了一個 8核8g 的服務器搭了一個服務器,但是我發現 RAM 只有8g是不夠用的,分分鐘爆了(這游戲內存泄漏是真的嚴重。。。。
)所以就想到了用 Swap 增大內存容量,但是由于我使用的服務器的硬盤用的甚至是機械硬盤,I/O速度堪憂。而 CPU
是8核的,跑分也還行,不壓榨白不壓榨,所以就想到了用 zRAM 增大內存了。這里以 Debian 系為例,記錄一下 zRAM
的開啟、掛載、使用、與卸載命令。
具體環境
OS: Debian 12
zRAM 和 Swap 區別
zRAM 和傳統的交換空間(Swap)都是 Linux 系統用來增加可用內存的技術,但它們的工作方式和使用場景有所不同。
傳統交換空間(Swap):
存儲介質: Swap 通常使用硬盤驅動器(HDD)或固態驅動器(SSD)作為交換區。
性能: 因為硬盤速度遠慢于 RAM,使用 Swap 可能會顯著減慢系統速度,尤其是在內存耗盡時。
可靠性: Swap 在不同的物理介質上,因此不會影響 RAM 的壽命。
用途: 在物理內存用完時,可以作為溢出區域,但由于速度慢,通常只適合非常低的內存壓力。
zRAM:
存儲介質: zRAM 是一種壓縮的 RAM 塊設備,它使用內存本身來存儲壓縮的數據。
性能: zRAM 的讀寫速度遠快于傳統 Swap,因為它直接在 RAM 上操作。壓縮和解壓縮數據需要一定的 CPU 資源,但通常這種開銷小于從硬盤讀寫數據的時間。
可靠性: 由于 zRAM使用的是 RAM,頻繁的讀寫可能會對 RAM 的壽命造成影響,盡管實際影響非常小。
用途: zram 非常適合用于擁有有限 RAM 或需要快速交換區的設備,如嵌入式設備或舊計算機,也常用于Android設備。
總結:
zRAM 提供了一種在不增加物理內存的情況下增加有效內存容量的方式,通過在 RAM 中創建一個壓縮塊設備來實現。
傳統的交換空間(Swap)是硬盤上的一部分,當系統的物理內存不足時,用作虛擬內存使用。
zram 特別適合于內存較小的系統,因為它可以以較小的性能開銷增加一些“虛擬”的內存,雖然這會增加 CPU 的負擔。
傳統 Swap 則適用于有足夠硬盤空間且內存壓力不是非常大的情況,特別是當系統負載不高,但偶爾需要更大內存時。
更佳實踐可能是將 zRAM 和傳統 Swap 結合起來使用,以獲得更靈活和更優化的性能。在內存緊張時,zRAM 可以提供更快的數據交換,而在 zRAM 也用盡時,傳統 Swap 可以作為最后的備份。
開啟/加載 zRAM 模塊
zRAM 是 Linux 內核的模塊,需要使用 modprobe
命令加載 zRAM 模塊。具體為 modprobe zram num_devices=1
。
zRAM 模塊的參數為num_devices,zram num_devices=1
表示創建一個設備文件,該文件將會保存在設備目錄,文件名稱是 /dev/zram0。
這里,如果 num_devices 的數值不等于 1,內核就會創建多個 zram 文件,具體為: /dev/zram{0,1,2,3...}。
為了檢查 zRAM 是否開啟,我們需要使用 lsmod 命令 :使用 lsmod | grep zram
確認是否成功加載,如果成功開啟,將會打印類似這樣的消息
zram 40960 2 zsmalloc 32768 1 zram
完整命令:
sudo modprobe zram num_devices=1 lsmod | grep zram
開機自動開啟/加載 zRAM 模塊
modprobe 加載的模塊僅在當前運行時可用,重新啟動計算機后,會消失。為了自動加載 zRAM 模塊,需要創建內核模塊載入文件和模塊的配置文件。
載入 zRAM 模塊。需要在 /etc/modules-load.d/ 目錄創建文件 zram.conf,運行命令 echo "zram" | sudo tee -a /etc/modules-load.d/zram.conf
。
然后創建模塊的配置文件 zram.conf。這個文件需要在目錄 /etc/modules-load.d/,運行命令 echo "options zram num_devices=1" | sudo tee -a /etc/modprobe.d/zram.conf
。
完整命令:
echo "zram" | sudo tee -a /etc/modules-load.d/zram.confecho "options zram num_devices=1" | sudo tee -a /etc/modprobe.d/zram.conf
配置 zRAM
通常 zRAM 最常見的配置是大小 disksize 和壓縮算法 comp_algorithm。
控制 zRAM 的大小的文件是 /sys/block/zram0/disksize ,壓縮算法文件是 /sys/block/zram0/comp_algorithm 。
可以運行 cat 命令查看兩個文件來確定 zRAM 文件的大小和壓縮算法,例如命令 cat /sys/block/zram0/disksize
查看 zRAM 大小。(zRAM 大小以實際 RAM 的 1-1.5倍 為宜,當然可以更大)
同樣也可以通過兩個文件設置 zRAM 文件的大小和壓縮算法,例如命令 echo "8G" | sudo tee /sys/block/zram0/disksize
修改 zRAM 的大小。(對于壓縮算法這里推薦zstd壓縮算法,各種算法區別具體可以Google)
注意: 請務必先選擇壓縮算法再選擇 zRAM 文件大小,不然會出現設備繁忙的問題,也就是無法修改壓縮算法了,需要卸載 zRAM 后重新配置。
完整命令:
cat /sys/block/zram0/disksizecat /sys/block/zram0/comp_algorithmecho "zstd" | sudo tee /sys/block/zram0/comp_algorithmecho "8G" | sudo tee /sys/block/zram0/disksize
自動進行 zRAM 配置
由于 /sys 目錄是基于內存的文件系統,因此同樣的,重啟系統后,我們設置的 zRAM 參數將不再存在。為了實現開機自動加載 zRAM 的參數,需要使用 udev 進行設置。
udev 是一個用戶空間系統(我的理解是,它就是 Linux 設備管理器)。它使操作系統管理員能夠為設備事件運行用戶指定的程序或者腳本,也可以在添加設備時指定設備參數。
要設置 zRAM 的大小,可以在 udev 規則文件的 ATTR 指定 zRAM 大小 disksize,ATTR{disksize}="8G" 表示設置 zRAM 的大小是 8G。
要設置 zRAM 的其它屬性,可以在 udev 規則文件指定多個 ATTR 屬性設置設備參數。例如設置 zRAM 壓縮算法 ,可以添加屬性 ATTR{comp_algorithm}="zstd"。
完整命令:
echo 'KERNEL=="zram0", ATTR{disksize}="8G",TAG+="systemd"' | sudo tee /etc/udev/rules.d/99-zram.rulesecho 'KERNEL=="zram0", ATTR{comp_algorithm}="zstd", ATTR{disksize}="8G", TAG+="systemd"' | sudo tee /etc/udev/rules.d/99-zram.rules
掛載 zRAM
要在當前運行時掛載 zRAM ,使用方式類似于 Swap 。首先需要將 zRAM 文件進行格式化,運行命令 sudo mkswap /dev/zram0
。
當格式化完成后,為了讓系統識別 zRAM 文件,因此還需要啟用 zRAM 文件。可以運行命令 sudo swapon /dev/zram0
啟用 zRAM 文件。
如果你系統已經存在 Swap ,那么總的交換空間的大小是zRAM的大小加 Swap 的大小。
完整命令:
sudo mkswap /dev/zram0 sudo swapon /dev/zram0
自動掛載 zRAM
同樣的,為了避免重啟后 zRAM 沒有自動掛載,我們需要使用 systemd
命令,在系統啟動時自動激活 zRAM 文件并作為交換空間掛載。
使用你喜歡的方式創建文件 /etc/systemd/system/zram.service 并且編輯它。由于我是 vim 黨,所以這里我使用vim 創建并編輯文件 SystemD 單元文件。
編輯完成后,保存文件并退出 vim 編輯器,然后運行命令 sudo systemctl enable zram
啟用 zram 服務,最后重啟計算機。
完整命令:
sudo vim /etc/systemd/system/zram.service sudo systemctl enable zram
zram.service內容:
[Unit]Description=Swap with zramAfter=multi-user.target[Service]Type=oneshotRemainAfterExit=trueExecStartPre=/sbin/mkswap /dev/zram0ExecStart=/sbin/swapon /dev/zram0ExecStop=/sbin/swapoff /dev/zram0[Install]WantedBy=multi-user.target
停止并禁用 zram 的服務
說完了基本使用,接下倆就要講講停用與卸載。(我最討厭那些講了怎么使用但是不講怎么卸載的教程了,讓我覺得體驗很差想要卸載的時候不知道自己卸載是否徹底,讓我這個對硬盤有極端控制欲的人很難受 )
我們上面將 zram 作為服務運行,所以可以通過 systemd
進行控制。以下命令可以停止并禁用 zram 服務:
sudo systemctl stop zramswap.service sudo systemctl disable zramswap.service
卸載 zram 模塊
可以使用 rmmod
命令完全卸載zram模塊。首先,確保沒有任何 zram 設備在使用中:
sudo swapoff /dev/zram0
然后,卸載 zram 內核模塊:
sudo rmmod zram
移除/注釋相關的 fstab 條目
如果 /etc/fstab 文件中有關于 zram 的條目,應該將其注釋掉或刪除。打開 /etc/fstab 文件:
sudo vim /etc/fstab
找到類似下面的行:
/dev/zram0 none swap defaults 0 0
將其注釋掉(在行首添加 #)或刪除。
參考文獻
好多前人的智慧,這里略了

