在 Linux 上用 zram 替代传统交换空间 | Linux 中国

我在我的电脑上花了很多时间(我是说工作),我发现了很多有趣的东西。其中最近引起我注意的是 zram0 设备。我是在几个月前写一篇文章时第一次注意到它,它显示在 lsblk 命令的输出中:

# lsblk
NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda             8:0    0 931.5G  0 disk
├─sda1          8:1    0   600M  0 part
[...]
zram0         252:0    0     8G  0 disk [SWAP]

它被识别为交换空间,这就是首先引起我的好奇心的原因,所以我做了一些研究。zram 最初被称为 “压缩缓存(compcache)”,即 “压缩的高速缓存”。事实证明,zram 是一个用于创建内存内压缩缓存的工具,特别是作为交换空间使用。

但为什么呢?

当我开始研究 zram 时,我只发现了几篇关于将 zram 用于交换空间的基础文章。起初,这对我来说似乎有点违反直觉。毕竟,如果你的内存快用完了,你把页面交换到内存中的虚拟驱动器中,有什么好处呢?

然后我找到了 Fedora 项目的维基页面,它提议使用 zram 交换空间(swap-on-zram)。该建议说:“交换是有用的,除了它的速度很慢。zram 是一个使用了压缩的内存驱动器。在启动时创建一个 zram 交换空间,并且不再使用默认的交换分区。”

该页面的其余部分是关于它的细节、好处、副作用和反馈。

Linux 上用于交换空间的 zram

使用 zram 作为交换空间,与常规的基于分区或基于文件的交换空间做的事情相同。当内存压力过大时,一些最近使用最少的数据会被移到交换空间。平均来说,它会被压缩到其原始大小的 50% 左右,并被放置在内存的 zram 空间中。这比将这些内存页存储在硬盘上要快得多,并可以释放出它所使用的内存用于其他用途。

节省交换空间

我试图找到关于配置多少交换空间或 zram 交换空间的总结建议。这使我重新回顾了交换空间的设置,以及我之前的文章《现代 Linux 系统的正确交换空间是多少?》。就我所知,从 RHEL 和 Fedora 的最新文档来看,推荐的交换空间数量并没有改变。不过,该文档忽略了 zram 的使用。

然而,在不使用 zram 的旧版 Linux 或 zram 被禁用的情况下,之前文章中的表格仍然为交换空间的分配提供了一个好的起点。

我找到的关于 zram 功能的文档在 zram 如何根据内存大小分配空间,以及分配给 zram 交换空间的数量方面是不一致的。

由于缺乏权威性的文档,我进行了一些实验来凭经验确定用于分配 zram 交换空间的算法。我为此使用了我自己的物理和虚拟系统。结果很有趣,与我迄今为止发现的任何文档都不一致。

在所有足够大的系统上,zram 的默认大小是 8GB,但在内存较小的主机上通常会大大减少。在我用于测试的一台虚拟机(VM)上,可以访问 4GB 的内存,zram 的虚拟交换空间被分配为 3.8GB。我的一台旧戴尔电脑拥有 8GB 的内存,zram 被设置为 7.6GB。当内存减少到 2GB 时,zram 就减少到 1.9GB。

我拥有的所有内存超过 8GB 的物理和虚拟主机都显示正好是 8GB 的 zram。这包括我拥有 64GB 内存的主工作站和其他拥有 16GB 或 32GB 内存的主机。

基于这几个数据点,我可以得出这样的结论:目前的默认设置是最多 8GB 的 zram,而在 8GB 或以下的主机上,zram 占内存的 95%。

我读过一些文章,其中提到了 zram 交换空间的其他大小,甚至高达 100% 的内存,但这些似乎都是理论上的,而不是现实。

你的发行版可能不同,但这里是 Fedora 和类似发行版的实际 zram 交换空间的分配情况:

  • 内存 ⇐ 8 GB:0.95 × 内存
  • 内存 > 8 GB:8 GB

请注意,zram 交换空间大小的算法并没有基于对任何给定的现实世界的系统或应用程序的 “最佳” 交换大小的建议。这种 zram 交换空间的分配是一种相当概率性的方法,它应该在广泛的 Linux 主机上运行良好。然而,最大的 zram 交换空间大小被配置为 8GB,而且我一直推荐 8GB 作为传统交换空间的最大容量,我想我可以说它反映了 zram 交换空间的最佳大小。

管理 zram 交换空间

zram 的默认值保存在 /usr/lib/systemd/zram-generator.conf 配置文件中。以下是我的一个测试虚拟机,分配了 5097GB 的内存。

# cat /usr/lib/systemd/zram-generator.conf
# This config file enables a /dev/zram0 device with the default settings:
# - size - same as available RAM or 8GB, whichever is less
# - compression - most likely lzo-rle
#
# To disable, uninstall zram-generator-defaults or create empty
# /etc/systemd/zram-generator.conf file.
[zram0]zram-size= min(ram, 8192)

你可以在 zram-generator.conf 配置文件的最后一行改变默认的 zram 交换空间大小。但我建议不要这样做,除非你能明确说明这样做的原因,并在你做任何改变后测试你的结果。像 Linux 中的许多其他配置默认值一样,zram 的默认值已经被很好地测试过了,适合大多数使用情况。

监控 zram

可以使用 zramctl 工具来查看 zram 的当前状态。

# zramctl
NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lzo-rle       4.8G   4K   80B   12K       4[SWAP]

传统的 swapon 命令也可以用来查看交换,包括作为交换使用的 zram:

# swapon --show
NAME       TYPE      SIZE USED PRIO
/dev/zram0 partition 4.8G   0B  100

需要注意的是,zramctl 在不包含数据时不报告 zram,所以结果会包含空输出。而像 lsblkswapon、 topfreehtop 等工具,即使不包含数据,也会显示 zram。

停用 zram

swapoff -a 命令会关闭 zram 交换空间以及用作交换的传统 HDD 或 SSD 存储。swapon -a 命令在 zram 为空时不显示它,可以使用 zramctl /dev/zram0 代替。

# swapon --show# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:00  120G  0 disk
├─sda1          8:10    1G  0 part /boot/efi
├─sda2          8:20    1G  0 part /boot
└─sda3          8:30  118G  0 part
  ├─vg01-root 253:00   10G  0 lvm  /
  ├─vg01-swap 253:10    3G  0 lvm  [SWAP]
  ├─vg01-usr  253:10   30G  0 lvm  /usr
  ├─vg01-home 253:20   10G  0 lvm  /home
  ├─vg01-var  253:30   30G  0 lvm  /var
  └─vg01-tmp  253:40   10G  0 lvm  /tmp
sr0            11:01 1024M  0 rom
zram0         252:00    0B  0 disk
# zramctl## zramctl /dev/zram0
NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lzo-rle         0B   0B    0B    0B       4

注意,/dev/zram0 在这些命令中并没有显示为交换空间,直到它被用于该目的。这给我造成了一些困惑,直到我的实验表明这是事实。

创建 zram 交换空间

zram 本身已经存在了大约 20 年,但只是在过去的一两年里才在一些发行版上作为交换空间使用。你的一些或所有主机上当前的 Linux 环境可能没有用 zram 创建交换空间。如果是这种情况,它可以很容易地被补救。

对于 Fedora 32,它是默认使用 zram 交换空间之前的最后一个版本,它只需要三个简单的命令。

首先,验证是否存在 zram-swap.service 文件,它作为 zram RPM 包的一部分安装:

# systemctl status zram-swap
● zram-swap.service - Enable compressed swap in memory using zram
     Loaded: loaded (/usr/lib/systemd/system/zram-swap.service; disabled; vendor preset: disabled)
     Active: inactive (dead)

接下来,安装 zram-generator-defaults 和 zram-generator 软件包:

# dnf install zram-generator-defaults zram-generator

启用并启动 zram-swap 服务:

# systemctl enable zram-swap.service# systemctl start zram-swap.service

然后验证 zram0 是否存在并被用作交换空间:

# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda             8:00  120G  0 disk
├─sda1          8:10    2G  0 part /boot
└─sda2          8:20  118G  0 part
  ├─vg01-root 253:00   10G  0 lvm  /
  ├─vg01-swap 253:10    3G  0 lvm  [SWAP]
  ├─vg01-usr  253:20   35G  0 lvm  /usr
  ├─vg01-tmp  253:30   15G  0 lvm  /tmp
  ├─vg01-var  253:40   35G  0 lvm  /var
  └─vg01-home 253:50   20G  0 lvm  /home
sr0            11:01 1024M  0 rom
zram0         252:00  7.5G  0 disk [SWAP]

用 zram 改进交换空间

这就是全部内容了。在 Fedora 上这很容易。不同的发行版可能也一样简单,只是软件包名称和命令的细节可能不同。在你的电脑上试试 zram 交换空间吧。在我的下一篇文章中,我将进一步演示一些 zram 选项。


via: https://opensource.com/article/22/11/zram-swap-linux

作者:David Both 选题:lkxed 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

编辑于 2023-01-28 11:44・IP 属地海南

Linux

Swap 分区

zram

​赞同 13​​4 条评论

​分享

​喜欢​收藏​申请转载

欢迎参与讨论

4 条评论

默认

最新

银河-蜗牛

银河-蜗牛

正如标题所说,zram 是*替代*传统 swap 的,不是一起用的。如果你用了传统 swap 同时又想要压缩内存,那可以用 zswap

2023-01-28 · IP 属地陕西

​回复​3

观观

观观

现在内存越来越大,swap基本都关了,而且很多软件部署安装时都要求关掉swap,比如ES

2023-01-30 · IP 属地上海

​回复​喜欢

胡萝卜

胡萝卜

银河-蜗牛

现在的企业部署应用都是用虚拟机,就虚拟机那磁盘io性能你觉得开swap体验怎么样。所以正常部署服务端应用就应该关掉swap。把Linux当桌面用在内存不是特别大的情况下可以开swap。

2023-12-08 · IP 属地湖北

​回复​喜欢

银河-蜗牛

银河-蜗牛

其实也不至于,对一些运行时不希望被swap的程序,可以放在cgroup里单独设置让它不使用swap

2023-01-30 · IP 属地陕西

​回复​喜欢

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要提高Linux系统的内存使用率,可以采取以下措施: 1. 调整内核参数:可以通过修改/proc/sys/vm/目录下的参数来调整内核的内存管理策略,例如增加内存页缓存的大小、减少内存回收的频率等。 2. 使用swap分区:将一部分硬盘空间作为swap分区,当内存不足时,系统会将一部分内存数据写入swap分区,从而释放出内存空间。 3. 关闭不必要的服务:关闭不必要的服务可以释放出一部分内存空间,提高系统的内存使用率。 4. 使用内存压缩技术:Linux内核提供了一些内存压缩技术,例如zram、zswap等,可以将一部分内存数据压缩后存储,从而节省内存空间。 5. 使用内存回收工具:Linux系统提供了一些内存回收工具,例如sysctl、vmstat等,可以监控和调整系统的内存使用情况,从而提高内存使用率。 ### 回答2: Linux 是一种稳定、高效的操作系统,对于大型数据处理和运算等需要大量内存的任务来说,如何提高内存使用率成为了一个非常重要的问题。下面就让我们来探讨一下 Linux 如何提高内存使用率。 一、使用 Hugepages Hugepages 是 Linux 内核所支持的一种特殊内存页,它的大小通常为 2MB 或 1GB,使用 Hugepages 能够显著地提高内存的使用效率。具体来说,它能够降低内存寻址、页表缓存等带来的性能损失,从而提高内存的占用效率。 二、使用 Swap 分区 Swap 分区是指将部分磁盘空间用作虚拟内存,当物理内存不足时,系统会将一部分内存数据暂时转存到 Swap 分区中。在大多数情况下,Swap 分区是无法替代物理内存的,但在某些情况下可以起到很好的辅助作用。 三、使用内存压缩技术 内存压缩技术可以将内存压缩成更小的数据块,从而在不减少实际存储容量的情况下提高内存使用率。在 Linux 中,有多种内存压缩技术可供选择,如 ZRAM、ZSWAP 等。 四、禁止内存泄漏 内存泄漏是指程序在使用内存时,没有及时释放不再使用的内存,导致内存占用持续增加而未能回收。在 Linux 中,内存泄漏很容易导致系统的内存使用率不断攀升,甚至最终导致系统崩溃。因此,及时发现和修复内存泄漏问题是提高内存使用率的必要手段之一。 五、升级内核和硬件 随着计算机硬件的不断发展和内核技术的不断更新,新的硬件和内核版本能够提供更好的内存管理方式和性能支持。因此,升级内核和硬件是提高 Linux 内存使用率的一个有效途径。特别是在大数据处理、深度学习等领域,性能要求较高的应用,升级为更高性能的硬件和最新版本的 Linux 内核是必不可少的。 总之,提高内存使用率需要对系统进行合理配置、优化和管理,而以上所述不同的方法都是提高内存使用率的有效手段。但不同的系统和应用场景可能对各种方法的适用性存在差异,因此在实际运用时需要根据具体情况选择合适的方案。 ### 回答3: Linux系统是一种开源的操作系统,其内存管理系统非常高效。然而在实际应用中,我们往往需要通过一些手段来提高Linux系统的内存使用率,以确保应用程序能够快速响应并高效运行。 下面我们介绍几种提高Linux内存使用率的方法: 1. 调整swappiness值 swappiness值定义了系统在内存不足时候会将数据交换交换分区的程度。可以将swappiness值设置为较低的数值以减少交换分区的使用,这样会使得内存使用更加高效。 可以通过以下命令查看当前的swappiness值: cat /proc/sys/vm/swappiness 可以通过以下命令修改swappiness值: echo 10 > /proc/sys/vm/swappiness 这条命令将swappiness值设置为10,可以根据实际情况自行设置数值。 2. 调整缓存大小 Linux系统中的缓存可以帮助加快数据访问速度,但是过多的缓存会占用过多的内存。我们可以通过修改/proc/sys/vm/vfs_cache_pressure的值来控制缓存的大小,减少缓存的使用以提高内存利用率。 可以通过以下命令查看当前的vfs_cache_pressure值: cat /proc/sys/vm/vfs_cache_pressure 可以通过以下命令修改vfs_cache_pressure值: echo 10 > /proc/sys/vm/vfs_cache_pressure 这条命令将vfs_cache_pressure值设置为10,可以根据实际情况自行设置数值。 3. 关闭不必要的服务 Linux系统中运行的服务会占用一定的内存。如果有不必要的服务运行,可以考虑关闭它们以释放内存。 可以通过以下命令查看当前运行的服务: systemctl list-unit-files | grep enabled 可以根据实际需要关闭不必要的服务,命令如下: systemctl stop servicename 这条命令可以停止指定的服务,servicename为服务的名称。 以上是几种提高Linux内存使用率的方法,使用这些方法可以充分利用系统的内存,确保应用程序的高效运行。但是,请注意,对于系统的修改,应慎重操作,避免出现不可预测的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值