我在我的计算机上使用 zram 作为压缩的 RAM 支持的交换。当系统需要交换某些内容时,将其交换为 zram 支持的交换文件或多或少相当于压缩内存中的数据以释放空间。相对于磁盘支持的交换,这使得交换在大多数情况下非常快。因此,我想知道是否可以通过鼓励系统更积极地换出未使用的东西来获得一些性能,因为它可以在不实际触及磁盘的情况下这样做?
那么有没有人vm.swappiness
在使用 zram 时设置为 100?这是可取的吗?
sysctl -w vm.swappiness=100
Run Code Online (Sandbox Code Playgroud) 我正在配置和编译新的 3.0 内核。我计划使用一段时间(通过修补)并合并到 3.0 中的好东西之一是 zram。
是否可以同时设置 hdd 交换和 zram 交换,以便首先使用 zram 并且只将溢出的页面放入实际交换?
我这里有一台只有 512 MB 内存的旧笔记本电脑。由于一些内核版本,我使用zram将其中的 256 MB 转换为压缩的 ramdisk,然后用作交换。这已被证明是非常成功的,并且系统响应更快,(硬盘支持的)交换使用率大幅下降,这使系统之前变慢了。
从 linux 3.0 开始,内核还包含cleancache,它使用 zram 之类的东西作为后端应该透明地压缩页面缓存中的页面。据我所知,这与zram不同。
我应该在我的笔记本电脑上启用这两个功能吗?还是cleancache实际上取代了zram解决方案?
编辑:我找到了这个gentoo 论坛链接,在那里我似乎还必须启用CONFIG_ZCACHE
它,然后让cleancache使用zram来获得类似于我以前的东西。所以似乎我启用了所有这些并且之后没有明确使用zram。有人可以证实这一点吗?
考虑以下场景。您有一个安装了 Linux的慢速只读媒体(例如写保护的拇指驱动器、CD/DVD 等)(不是 Live CD 本身,而是正常版本),并且在没有字面意义的计算机上使用它其他形式的存储。它很慢,因为它是 USB 2。根文件系统作为overlayfs 挂载,因此它对于日志和您所做的许多其他临时工作是“可写的”,但所有写入都转到 RAM (tmpfs upperdir)。为Live发行情况非常典型的场景。
由于没有其他形式的存储,swap 挂载在 zram 上。因此,当 Linux 决定交换时,它会压缩这些页面并将它们仍然存储在 RAM 中,但至少它们是被压缩的。这实际上很不错,因为大多数应用程序的 RAM 很容易压缩(RAM 通常在数据中非常冗余,因为它意味着“快速”)。这适用于应用程序内存,但不适用于 tmpfs。
事情是这样的:zram很快,令人难以置信。另一方面,拇指驱动器很慢。假设它是 20 MiB/s,相比之下这真的很慢。您可以在这里看到问题以及为什么内核不会做正确的事情。
请注意,此问题不是重复如何使 TMPFS 内的文件更可能交换。问题几乎相同,但我对那个问题的答案并不满意,抱歉。内核绝对不会不自行做“正确的事”,不管如何聪明的人设计它是。我不喜欢人们不了解情况并认为他们更了解情况。他们迎合一般情况。这就是 Linux 具有如此可调整性的原因,因为无论它多么智能,它都无法预测它的用途。
例如,我可以(并且确实)将vm.swappiness (/proc/sys/vm/swappiness) 设置为 100,这告诉它积极交换应用程序内存并保留文件缓存。这个选项很好,但不幸的是,它不是全部。
我希望它在处理交换时将文件缓存优先于任何其他 RAM 使用。这是因为丢弃文件缓存导致它不得不从慢20 MIB /秒的驱动器,这是多读回多比交换zram慢。对于应用程序,vm.swappiness 有效,但不适用于 tmpfs。
tmpfs 挂载为页缓存,因此它与文件缓存具有相同的优先级。如果您从 tmpfs 读取文件,它将优先于较旧的文件缓存条目(最近使用)。但是,这是不好的,内核显然没有做正确的事情在这里。应该考虑将 tmpfs 交换为 zram 比文件缓存“最近使用”要好得多,因为从驱动器读取非常慢。
所以我需要明确地告诉它与文件缓存相比更频繁地从 tmpfs 交换:它应该比 tmpfs 保留更多的文件缓存。/proc/sys/vm 中有很多选项,但我找不到。真让人失望。
如果做不到这一点,有没有办法告诉内核某些设备/驱动器比其他设备/驱动器慢得多,并且它应该比其他人更愿意为它们保留缓存?tmpfs 和 zram 很快。拇指驱动器不是。我可以告诉内核这个信息吗? …
我有一台基于 Marwell Kirkwood ARM 的 NAS 服务器 Zyxel NSA 310。我编译了自己的 3.8 内核并启用了 ZCACHE,但我仍然看到 256 MB 的 RAM。我不确定 GNU 免费实用程序是否应该显示额外的 RAM 量。我怎么知道它真的有效?我需要做一些额外的步骤来使用它吗?我在命令行中添加了“zcache”。
root@nas:~# free -m
total used free shared buffers cached
Mem: 247 218 29 0 7 166
-/+ buffers/cache: 43 203
Swap: 1427 0 1427
root@nas:~# zgrep CACHE /proc/config.gz
CONFIG_CLEANCACHE=y
CONFIG_ZCACHE=y
root@nas:~# dmesg | grep zcache
Kernel command line: console=ttyS0,115200 root=/dev/sda3 zcache
zcache: using lzo compressor
zcache: cleancache enabled using kernel transcendent memory and compression buddies
zcache: cleancache: ignorenonactive = …
Run Code Online (Sandbox Code Playgroud) 使用 zram 的主要缺点是LRU 反转:
较旧的页面进入优先级较高的 zram 并快速填充它,而较新的页面被换入和换出较慢的 [...] 交换
该zswap文件说,zswap不会从此苦:
Zswap 通过 Frontswap API 接收要压缩的页面,并且能够在 LRU 的基础上从其自己的压缩池中驱逐页面,并在压缩池已满的情况下将它们写回后备交换设备。
通过设置max_pool_percent
为,我可以拥有 zram 的所有好处和完全压缩的 RAM100
吗?
Run Code Online (Sandbox Code Playgroud)Zswap seeks to be simple in its policies. Sysfs attributes allow for one user controlled policy: * max_pool_percent - The maximum percentage of memory that the compressed pool can occupy.
max_pool_percent
这里没有指定默认值,但Arch Wiki 页面说它是20
.
除了解压对性能的影响外,设置max_pool_percent
为是否有任何危险/不利因素100
?
它会像使用改进的交换支持的 zram 一样操作吗?
我设置了 zram 并在我的 Linux 机器中进行了广泛的测试,以衡量它对我的场景是否真的有帮助。但是,我很困惑 zram似乎耗尽了整个未压缩数据大小的内存。当我输入“zramctl”时,我看到:
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 2G 853,6M 355,1M 367,1M 4 [SWAP]
Run Code Online (Sandbox Code Playgroud)
根据 zramctl 的帮助命令,DATA
是未压缩的大小和TOTAL
包含元数据的压缩内存。然而,当我输入 时swapon -s
,我看到以下输出:
Filename Type size used Priority
/dev/sda2 partition 1463292 0 4
/dev/zram0 partition 2024224 906240 5
Run Code Online (Sandbox Code Playgroud)
906240
是以千字节为单位的已用内存,可转换为DATA
zramctl 的 853,6M 值。这给人留下的印象是,压缩的 zram 设备需要的内存多于它节省的内存。一旦DATA
满了,它实际上开始交换到磁盘驱动器,因此它肯定已满。
为什么zram看似占用了原始数据大小的内存?COMPR
为什么它不是or的大小TOTAL
?网上好像还没有这方面的资料,因为我还没有找到这方面的任何信息。谢谢你!
文档指出 zRAM 写回功能仅支持交换分区,因为它是backing_dev
. 但我也成功地使用了交换文件,将其附加到循环设备
losetup /dev/loop0 /swapfile
cd /sys/block/zram0
echo /dev/loop0 > backing_dev
echo 8G > disksize
mkswap /dev/zram0
swapon /dev/zram0
Run Code Online (Sandbox Code Playgroud)
之后,swapon -s
显示 zRAM 设备已启用,cat /sys/block/zram0/backing_dev
返回/dev/loop0
并echo huge > /sys/block/zram0/writeback
正常工作,并cat /sys/block/zram0/bd_stats
确认写入确实成功
这个可以用吗,或者这个方法有一些令人讨厌的缺点吗?
我在zstd
中找到/drivers/block/zram/zcomp.c
,但在 中找不到任何与 zstd 相关的内容/crypto
。那么 zstd for zram 是否真的在 Linux 4.15 中可用?