我在我的电脑上花了很多时间(我的意思是工作),我发现了很多有趣的东西。最近引起我注意的是zram0设备。我第一次注意到它是在几个月前写一篇文章时,它出现在lsblk命令的输出中:#lsblkNAMEMAJ:MINRMSIZEROTYPEMOUNTPOINTSsda8:00931.5G0disk├─sda18:10600M0part[...]zram0252:008G0disk[SWAP]它被识别为交换空间,这首先引起了我的好奇心,所以我做了一些研究。zram原名“compressedcachecompcache”,即“压缩缓存”。事实证明,zram是一种在内存中创建压缩缓存的工具,特别是用作交换空间。但为什么?当我开始研究zram时,我只找到了几篇关于将zram用于交换空间的基本文章。起初,这对我来说似乎违反直觉。毕竟,如果内存不足,将页面交换到内存中的虚拟驱动器有什么用呢?然后找到了Fedora项目的wiki页面,里面建议使用zram交换空间swap-on-zram。建议说:“Swap很有用,只是速度慢。zram是一种使用压缩的内存驱动器。在启动时创建一个zram交换空间,不要再使用默认的交换分区。”页面的其余部分是关于它的细节、好处、副作用和反馈。Linux上用于交换空间的zram使用zram作为交换空间,与常规的基于分区或基于文件的交换空间做同样的事情。当内存压力变得过高时,一些最近最少使用的数据被移动到交换空间。平均来说,它被压缩到原来大小的50%左右,放在内存的zram空间中。这比将这些内存页面存储在硬盘上要快得多,并且可以释放它用于其他用途的内存。节省交换空间我试图找到有关配置多少交换空间或zram交换空间的摘要建议。这让我重新审视了交换空间设置,以及我之前的文章《??现代 Linux 系统的正确交换空间是多少???》。据我所知,根据RHEL和Fedora的最新文档,建议的交换空间量没有改变。但是,文档忽略了zram的使用。但是,上一篇文章中的表格仍然为不使用zram或禁用zram的旧Linux发行版上的交换空间分配提供了一个很好的起点。我发现的关于zram功能的文档在zram如何根据内存大小分配空间以及分配给zram的交换空间量方面不一致。由于缺乏权威文档,我进行了一些实验,根据经验确定用于分配zram交换空间的算法。为此,我使用自己的物理和虚拟系统。结果很有趣,并且与我目前找到的任何文档都不一致。在所有足够大的系统上,zram的默认大小为8GB,但在内存较少的主机上通常要小得多。在我用于测试的一台虚拟机(VM)上,可访问4GB内存,zram的虚拟交换空间分配了3.8GB。我的一台旧戴尔电脑有8GB内存,而zram设置为7.6GB。当内存降为2GB时,zram降为1.9GB。我拥有超过8GB内存的所有物理和虚拟主机都显示正好8GB的??zram。这包括我的具有64GBRAM的主工作站和具有16GB或32GBRAM的其他主机。基于这几个数据点,我可以得出结论,当前默认最大为8GB的??zram,而在8GB或更少的主机上,zram占用了95%的内存。我读过一些文章提到了zram交换空间的其他大小,甚至高达100%RAM,但这些似乎是理论上的,而不是现实的。您的发行版可能不同,但这是Fedora和类似发行版的实际zram交换分配:RAM?8GB:0.95xRAMRAM>8GB:8GB请注意,zram交换大小算法不建议基于“任何给定的真实世界系统或应用程序的最佳”交换大小。这种zram交换空间的分配是一种相当概率的方法,应该适用于广泛的Linux主机。但是,最大zram交换大小配置为8GB,并且由于我一直建议将8GB作为传统交换最大值,我想我可以说它反映了最佳zram交换大小。管理zram交换空间zram的默认值保存在/usr/lib/systemd/zram-generator.conf配置文件中。下面是我的测试虚拟机之一,分配了5097GB内存。#cat/usr/lib/systemd/zram-generator.conf#此配置文件使用默认设置启用/dev/zram0设备:#-大小-与可用RAM或8GB相同,以较小者为准#-压缩-最有可能lzo-rle##要禁用,卸载zram-generator-defaults或创建空#/etc/systemd/zram-generator.conf文件。[zram0]zram-size=min(ram,8192)你可以在zram-中设置generator.conf配置文件的最后一行更改了默认的zram交换大小。但我建议不要这样做,除非你能清楚地说明你为什么这样做,并在你做出任何改变后测试你的结果。与Linux中的许多其他配置默认值一样,zram的默认值经过了很好的测试,适用于大多数用例。监控zram可以使用zramctl工具查看zram的当前状态。#zramctlNAMEALGORITHMDISKSIZEDATACOMPRTOTALSTREAMSMOUNTPOINT/dev/zram0lzo-rle4.8G4K80B12K4[SWAP]也可以使用传统的swapon命令查看swap,包括用作swap的zram:#swapon--showNAMETYPESIZEUSED??PRIO/dev/zram0partition4.8G0B100注意zramctl在没有数据的时候不会报zram,所以结果会包含空输出。而像lsblk、swapon、top、free、htop等工具即使不包含数据也会显示zram。禁用zramswapoff-a命令将关闭zram交换空间以及用于交换的传统HDD或SSD存储。swapon-a命令为空时不显示zram,改用zramctl/dev/zram0。#swapon--show#lsblkNAMEMAJ:MINRMSIZEROTYPEMOUNTPOINTSsda8:00120G0disk├─sda18:101G0part/boot/efi├─sda28:201G0part/boot└─sda38:30118G0part├─vg01-root253:0010G0lvm/├─vg01-swap253:103G0lvm[SWAP]├─vg01-usr253:1030G0lvm/usr├─vg01-home253:2010G0lvm/home├─vg01-var253:3030G0lvm/var└─vg01-tmp253:4010G0lvm/tmpsr011:011024M0romzram0252:000B0disk#zramctl##zramctl/dev/zram0NAMEALGORITHMDISKSIZEDATACOMPRTOTALSTREAMSMOUNTPOINT/dev/zram0lzo-rle0B0B0B0B4请注意,/dev/zram0在用于该目的之前不会在这些命令中显示为交换空间。这让我有些困惑,直到我的实验表明情况确实如此。创建zram交换空间zram本身已经存在了大约20年,但仅在过去的一两年内它才被用作某些发行版的交换空间。您当前在部分或所有主机上的Linux环境可能没有使用zram创建交换空间。如果是这种情况,很容易补救。对于默认使用zram交换空间之前的最后一个版本Fedora32,它只需要三个简单的命令。首先,验证zram-swap.service文件是否存在,它作为zramRPM包的一部分安装:#systemctlstatuszram-swapzram-swap.service-Enablecompressedswapinmemoryusingzramlib/systemd/system/zram-swap.service;disabled;vendorpreset:disabled)Active:inactive(dead)接下来,安装zram-generator-defaults和zram-generatorPackage:#dnfinstallzram-generator-defaultszram-generator启用并启动zram-swap服务:#systemctlenablezram-swap.service#systemctlstartzram-swap.service然后验证zram0是否存在并用作交换空间:#lsblkNAMEMAJ:MINRMSIZEROTYPEMOUNTPOINTsda8:00120G0disk├─sda18:102G0part/boot└─sda28:20118G0part├─vg01-root253:0010G0lvm/├─vg01-swap253:103G0lvm[SWAP]├─vg01-usr253:2035G0lvm/usr├─vg01-tmp253:3015G0lvm/tmp├─vg01-var253:4035G0lvm/var└─vg01-home253:5020G0lvm/homesr011:011024M0romzram0252:007.5G0磁盘[SWAP]使用zram改进交换空间,这就是它的全部在Fedora上这很容易。不同的发行版可能一样简单,只是包名称和命令的细节可能有所不同。在您的计算机上尝试zram交换空间。在我的下一篇文章中,我将进一步演示一些zram选项。
