前言
【Linux内核工具】zram的开启、挂载与使用。最近在玩幻兽帕鲁,自己用了一个8核8g的服务器搭了一个服务器,但是我发现RAM只有8g是不够用的,分分钟爆了,这游戏内存泄漏是真的严重。。。。所以就想到了用swap增大内存容量,但是由于我使用的服务器的硬盘用的甚至是机械硬盘,I/O速度堪忧,但是CPU是8核的,不压榨白不压榨,所以就用zram增大内存了,这边记录一下命令,方便些之后使用。
具体环境
OS: Debian 12
ssh工具: finalshell
zram和swap区别
来自GPT4
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 内核的模块,要启用 zRAM 请使用 modprobe
命令加载 zRAM 模块。运行命令 modprobe zram num_devices=1
。
num_devices 是 zRAM 模块的参数,zram num_devices=1
表示仅创建一个设备文件,该文件将会保存在设备目录,文件名称是 /dev/zram0。
如果 num_devices 的数值不等于 1,内核将会创建多个 zram 文件 /dev/zram{0,1,2,3...}。
然后运行 lsmod 命令 lsmod | grep zram
确认是否成功加载。命令将会打印消息 zram 32768 0 。
sudo modprobe zram num_devices=1
lsmod | grep zram
zram 32768 0
持久化开启/加载 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.conf
echo "options zram num_devices=1" | sudo tee -a /etc/modprobe.d/zram.conf
我的搬瓦工使用不了sudo
指令,也蛮逆天的,这里本身就是管理员的话可以省略sudo
。
配置 zRAM
通常 zRAM 最常用的设置选项是 zRAM 的大小 disksize 和 zRAM 的压缩算法 comp_algorithm。
控制 zRAM 的大小的文件是 /sys/block/zram0/disksize ,压缩算法文件是 /sys/block/zram0/comp_algorithm 。
可以运行 cat 命令查看两个文件来确定 zRAM 文件的大小和压缩算法,例如命令 cat /sys/block/zram0/disksize
查看 zRAM 大小。(推荐zstd压缩算法)
同样也可以通过两个文件设置 zRAM 文件的大小和压缩算法,例如命令 echo "512M" | sudo tee /sys/block/zram0/disksize
修改 zRAM 的大小。
注意:请务必先选择压缩算法再选择zram文件大小,不然会出现设备繁忙....
cat /sys/block/zram0/disksize
cat /sys/block/zram0/comp_algorithm
echo "zstd" | sudo tee /sys/block/zram0/comp_algorithm
echo "512M" | sudo tee /sys/block/zram0/disksize
持久化 zRAM 配置
由于 /sys 目录是基于内存的文件系统,因此重启系统后,你设置的 zRAM 参数将不再存在。要持久化 zRAM 的参数,请使用 udev 进行设置。
udev 是一个用户空间系统,简单来说就是 Linux 设备管理器。它使操作系统管理员能够为设备事件运行用户指定的程序或者脚本,也可以在添加设备时指定设备参数。
要设置 zRAM 的大小,可以在 udev 规则文件的 ATTR 指定 zRAM 大小 disksize,ATTR{disksize}="512M" 表示设置 zRAM 的大小是 512M。
要设置 zRAM 的其它属性,可以在 udev 规则文件指定多个 ATTR 属性设置设备参数。例如设置 zRAM 压缩算法 ,可以添加属性 ATTR{comp_algorithm}="zstd"。
# Persistent
echo 'KERNEL=="zram0", ATTR{disksize}="512M",TAG+="systemd"' | sudo tee /etc/udev/rules.d/99-zram.rules
echo 'KERNEL=="zram0", ATTR{comp_algorithm}="zstd", ATTR{disksize}="512M", TAG+="systemd"' | sudo tee /etc/udev/rules.d/99-zram.rules
激活 zRAM
要在当前运行时启用 zRAM 可以将 zRAM 当作交换空间一样的方式启用。首先需要将 zRAM 文件进行格式化,运行命令 sudo mkswap /dev/zram0
。
当格式化完成后,为了让系统识别 zRAM 文件,因此还需要启用 zRAM 文件。可以运行命令 sudo swapon /dev/zram0
启用 zRAM 文件。
如果你系统已经存在交换空间,那么总的交换空间的大小是zRAM的大小加交换空间的大小。
sudo mkswap /dev/zram0
sudo swapon /dev/zram0
自动挂载 zRAM
现在已经在内核启用 zRAM 模块,接下来创建 SystemD 单元文件,在系统启动时自动激活 zRAM 文件并作为交换空间挂载。
使用你喜欢的文本编辑器创建文件 /etc/systemd/system/zram.service 。在本教程中,我们使用vim 创建并编辑文件 SystemD 单元文件。
编辑完成后,保存文件并退出 vim 编辑器,然后运行命令 sudo systemctl enable zram
启用 zram 服务,最后重启计算机。
sudo vim /etc/systemd/system/zram.service
sudo systemctl enable zram
[Unit]
Description=Swap with zram
After=multi-user.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStartPre=/sbin/mkswap /dev/zram0
ExecStart=/sbin/swapon /dev/zram0
ExecStop=/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
将其注释掉(在行首添加 #)或删除。
暂无评论内容