在 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 zramLoaded: 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 属地陕西

​回复​喜欢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/719382.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/719382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VPX637】基于XCKU115 FPGA+ZU15EG MPSOC的6U VPX双FMC接口通用信号处理平台

VPX637是一款基于6U VPX总线架构的通用实时信号处理平台,该平台采用一片Xilinx的高性能Kintex UltraScale系列FPGA(XCKU115-2FLVF1924I)作为预处理单元,外挂2个FMC扩展接口,来完成数据采集、数据回放以及实时信号处理算…

[动态规划,DFS深度搜索]滑雪

滑雪 题目描述 Michael喜欢滑雪,这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中的最长底滑坡。区域…

Java---文件,流✨❤️

文章目录 1.遍历文件夹2.遍历子文件夹3.练习流4.以字节流的形式读取文件内容5.以字节流的形式向文件写入数据顶折纠问6 .写入数据到文件 1.遍历文件夹 一般说来操作系统都会安装在C盘,所以会有一个 C:\WINDOWS目录。 遍历这个目录下所有的文件(不用遍历子目录) 找出…

ssh连接ubantu失败

新系统Ubuntu20.4 安装ssh server 1. 安装 openssh-server2. 开启22号端口 # 安装ssh服务 sudo apt-get install openssh-server # 安装防火墙 sudo apt-get install ufw # 开启防火墙 sudo ufw enable #放开22端口 sudo ufw allow 22 开启22号端口 倘若ubuntu没有开启22…

HTTP/2、HTTP/3分别解决了什么问题

总的来说就是HTTP/1.1是请求-响应模型导致队头阻塞问题,HTTP2是TCP层面导致队头阻塞问题 HTTP/2 多路复用,解决了HTTP/1.1队头阻塞问题 HTTP/1.1 的实现是基于请求-响应模型的。同一个连接中,HTTP 完成一个事务(请求与响应&…

3.4作业

课上代码复习&#xff1a; 广播接收端代码: #include<myhead.h> int main(int argc, const char *argv[]) {//创建套接字int rfd socket(AF_INET,SOCK_DGRAM,0);if(rfd -1){perror("socket error");return -1;}printf("rfd %d\n",rfd);//填充地…

台式电脑电源各线的电压和电流输出和输出电流

台式电脑电源是电脑硬件的重要组成部分。 它为计算机的各个部件提供所需的电压和电流。 不同的硬件设备和组件有不同的电压和电流输出。 下面详细介绍台式电脑电源各线的电压&#xff0c;包括3.3V、5V、12V、-12V、-5V和5VSB&#xff0c;以及它们的输出电流和用途。 3.3V&#…

【AI+CAD】(一)ezdxf 解析DXF文件

DXF文件格式理解 DXF文件格式是矢量图形文件格式&#xff0c;其详细说明了如何表示不同的图形元素。 DXF是一个矢量图形文件&#xff0c;它捕获CAD图形的所有元素&#xff0c;例如文本&#xff0c;线条和形状。更重要的是&#xff0c;DXF是用于在CAD应用程序之间传输数据的图形…

STM32自学☞I2C

这里只是大体介绍&#xff0c;具体的可参考STM32数据手册

数据结构与算法-选择排序

引言 在计算机科学中&#xff0c;数据结构和算法是两个至关重要的基石。它们共同决定了程序的效率、可读性和可维护性。本文我们将聚焦于一种基础而直观的排序算法——选择排序&#xff0c;并探讨其内在的工作机制以及在实际应用中的优缺点。 一、什么是选择排序&#xff1f; …

Leetcode 3067. Count Pairs of Connectable Servers in a Weighted Tree Network

Leetcode 3067. Count Pairs of Connectable Servers in a Weighted Tree Network 1. 解题思路2. 代码实现 题目链接&#xff1a;3067. Count Pairs of Connectable Servers in a Weighted Tree Network 1. 解题思路 这一题没想到什么好的方法&#xff0c;走的是暴力求解的路…

xss.haozi.me:0x07

<img src1 onerroralert(1)

Spring MVC ThemeResolver原理解析

在Spring MVC框架中&#xff0c;ThemeResolver&#xff08;主题解析器&#xff09;是一个重要但经常被忽视的组件。它负责解析和管理Web应用程序中的主题设置&#xff0c;允许用户根据不同的需求和偏好切换界面主题。ThemeResolver为开发者提供了一种灵活的方式来控制应用程序的…

tomcat下载安装配置教程

tomcat下载安装配置教程 我是使用tomcat下载安装及配置教程_tomcat安装-CSDN博客 此贴来进行安装配置&#xff0c;原文21年已经有些许不同。 下载tomcat 官网&#xff1a;http://tomcat.apache.org/ 我们老师让安装8.5以上&#xff0c;所以我直接选择版本9 点击9页面之后…

DPDK常用API合集三

librte_timer 此库为 DPDK 执行单元提供定时器服务&#xff0c;提供异步执行函数的能力。它可以是周期性的函数调用&#xff0c;也可以是一次性调用。它使用环境抽象层&#xff08;EAL&#xff09;提供的定时器接口获取精确的时间参考&#xff0c;并可以根据需要以每个核心为基…

2024.03.03蓝桥云课笔记——排序

sort简介 #include<algorithm> 使用的是快速排序 时间复杂度为O(nlogn) sort使用(默认是从小到大) 1.sort(起始地址&#xff0c;结束地址的下一位&#xff0c;*比较函数&#xff09;&#xff1b; #include<iostream> #include<algorithm> using namesp…

HTTPS的实现原理

图片来源&#xff1a;HTTPS 详解一&#xff1a;附带最精美详尽的 HTTPS 原理图 - 个人文章 - SegmentFault 思否 加密流程按图中的序号分为&#xff1a; 客户端请求 HTTPS 网址&#xff0c;然后连接到 server 的 443 端口 (HTTPS 默认端口&#xff0c;类似于 HTTP 的80端口)。…

Windows批处理:bat文件学习

目录 第一章、快速了解Windows批处理1.1&#xff09;Windows批处理相关概念介绍1.1.1&#xff09;批处理的起源1.1.2&#xff09;bat文件介绍 1.2&#xff09;Demo1.2.1&#xff09;创建文件添加命令1.2.2&#xff09;bat脚本中的命令解释 第二章、实例2.1&#xff09;点击bat文…

navicat安装11.3

一、安装navicat 1、下载navicat 2、解压压缩包 3、点击exe文件 4、输入密钥&#xff1a; NAVH-WK6A-DMVK-DKW3 5、点击打开&#xff1a; 输入连接参数&#xff1a; 6、查看连接好仓库 7、 在使用navicat来编写sql语句 8、编写语句 连接不上问题&#xff0c;检查问题&#…

[出错]-RuntimeError: “slow_conv_transpose2d_out_cpu“ not implemented for ‘Byte‘

一开始我一直一维是torch版本的问题 输入是用cv2读出来的&#xff0c;数据类型dtype是默认是unit8&#xff0c;输入到模型中&#xff0c;除了要将他转为tenso以外&#xff0c;还要.float将数据类型转为浮点数。