使用 zram 时 vm.swappiness 的合适值是多少?

使用 zram 时 vm.swappiness 的合适值是多少?

我在计算机上使用 zram 作为压缩的 RAM 支持的交换区。当系统需要交换某些内容时,将其交换到 zram 支持的交换文件或多或少相当于压缩内存中的数据以释放空间。相对于磁盘支持的交换,这使得交换在大多数情况下都非常快。因此,我想知道通过鼓励系统更积极地交换未使用的内容是否可以获得一些性能,因为它可以在不实际访问磁盘的情况下这样做?

vm.swappiness那么有人在使用 zram 时搞乱过,比如设置为 100 吗?这是可取的吗?

sysctl -w vm.swappiness=100

答案1

简短回答:vm.swappiness=100适当的值对于 zram(至少在 Debian Stretch 和 Linux 4.9 上,我相信这是最有价值的)

我已经vm.swappiness=100为我测试了。

我想你可以做一些简单的测试以确定哪个值最适合您。

我还做了另一个简单的程序为了测试这个问题。 x 在我的机器上,非常低的vm.swappiness值(例如vm.swappiness=1)将导致明显的响应问题。

关于:SwapCached/proc/meminfo

首先,尝试一下vm.page-cluster=0,这个也许可以减少一些无用的SwapCached交换。

SwapCached 可以像非 zram 交换设备一样加速 zram

SwapCached必要时可以重复使用(免费):

./linux-4.9/mm$ grep -rn delete_from_swap_cache
memory-failure.c:715:   delete_from_swap_cache(p);
shmem.c:1115:       delete_from_swap_cache(*pagep);
shmem.c:1645:            * unaccounting, now delete_from_swap_cache() will do
shmem.c:1652:               delete_from_swap_cache(page);
shmem.c:1668:       delete_from_swap_cache(page);
vmscan.c:673:       __delete_from_swap_cache(page);
swap_state.c:137:void __delete_from_swap_cache(struct page *page)
swap_state.c:218:void delete_from_swap_cache(struct page *page)
swap_state.c:227:   __delete_from_swap_cache(page);
swapfile.c:947:         delete_from_swap_cache(page);
swapfile.c:987: delete_from_swap_cache(page);
swapfile.c:1023:            delete_from_swap_cache(page);
swapfile.c:1571:            delete_from_swap_cache(page);
./linux-4.9/mm$ 

答案2

我真的不建议将 swappiness 设置得更高。内核中的一个常见机制是它将页面(内存块)放入交换区中,以释放一些内存供其他正在运行的任务使用。

第一个“问题”是,当内核想要释放 n 个页面时,m 个(m < n,m 是容纳 n 所需的压缩页面数)是在 RAM 中新创建的,我不确定这是否会干扰内核。

不管怎样,当交换中有页面时,您以后可能会在交换中使用该应用程序及其某些页面。内核所做的是将这些页面带回物理内存,但不会将它们从交换中删除(使用标准交换可以将其视为缓存,因此当应用程序返回后台时,内核不必将这些页面写回到慢速交换区中)。然而,对于 zram 来说,这可能不是一个明智的技巧,因为你的内存中包含 zram 中的 m 页 + 内存中的 n 页!

内核通常有一个“总内存”,可以用来完成其业务。当您添加 zram 时,它仅计入“交换”内存,就像任何基于磁盘的交换一样,但它减少了实际的“总内存”,而这不是内核所期望/预期的。有时您可能会因此而出现奇怪且不受欢迎的行为!

使用 zram 时,当内核面临内存压力时,最好不要与该区域进行过多交换。而且您应该始终拥有一个至少大于 zram 最大大小的真实硬盘交换分区,这样系统就不会出现 OOM,同时您会看到报告的大量可用空间free

答案3

https://wiki.archlinux.org/title/Zram#Optimizing_swap_on_zram

这些值是Pop!_OS 使用什么。 Pop!_OS GitHub 拉取请求也链接到用户在 r/Fedora 上完成的一些测试,这确定 vm.page-cluster = 0 是理想的。他们还发现高交换值是理想的,这与建议的相匹配内核文档:

默认值为 60。对于内存中交换(例如 zram 或 zswap)以及在比文件系统更快的设备上进行交换的混合设置,可以考虑超过 100 的值。例如,如果针对交换设备的随机 IO 平均比来自文件系统的 IO 快 2 倍,则交换性应为 133 (x + 2x = 200, 2x = 133.33)。

答案4

当内存已满时,需要将页面换出(到磁盘)。如果您使用内存来创建当内存已满时交换页面的位置,人们会认为它超出了目的,除非压缩产生了影响(然后很自然地直接压缩内存而不是通过交换)。我想人们必须对此进行基准测试,因为与内存速度相比,计算机的压缩和解压缩速度越来越快。

相关内容