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


13

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

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

sysctl -w vm.swappiness=100

2
这是一个很好的问题,我认为一些基准测试是为了消除观点并了解事实……
Geek老人2016年

好主意,自从我上次使用zram以来,zram可能会有所改善:-)
惠更斯(Huygens)2016年

做了一个小测试,据我所知,为zram“保留”的内存仍用作缓存。如果这一点得到确认,那么我认为将交换率保持在较低水平以避免CPU周期可能有意义吗?
维托尔

Answers:


2

我真的不建议将交换性提高。内核中的一种常见机制是,它将页面(内存块)放在交换中,以释放一些内存以供其他正在运行的任务使用。

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

然后,无论如何,当交换中有页面时,以后可能会在交换中使用应用程序及其某些页面。内核所做的是将这些页面带回到物理内存中,但并没有将它们从交换中删除(通过标准交换可以将其视为缓存,因此当应用程序回到后台时,内核不必写回这些页面进入慢速交换)。但是,使用zram可能不是明智的选择,因为您在内存中拥有zram中的m页+内存中又有n页!

内核通常具有一个“总内存”,可以用来完成其业务。当您添加zram时,它仅计入“交换”内存,就像任何基于磁盘的交换一样,但是它减少了实际的“总内存”,并且内核不希望这样做。因此,有时您可能会有怪异而不想要的行为!

使用zram时,最好让内核在处于内存压力下时不要过多交换该区域。而且,您应该始终拥有一个至少大于zram最大大小的实际硬盘交换分区,以使系统不会出现OOM,而同时,您将看到free!所报告的大量可用空间!


zram提供RAM块设备。写入这些块设备的所有内容都会被压缩。如果将zram块设备用作交换,则当系统尝试将部分内存移动以进行交换时,它将有效地将内存从RAM的一部分移至另一部分,除了将数据复制到目标之前将其压缩。这有效地用作便宜的内存压缩机制,以提高内存量有限的系统的响应速度。从Linux 2.6.33开始,Zram一直处于升级阶段。在3.14版本中,zram已从暂存移到了driver / block / zram。
年长者怪胎

1
完全是@ElderGeek!我将举一个例子来说明为什么这并不完美。内核将尝试删除64MB的RAM,并将其放入zram交换中。压缩后的64MB块现在为32MB。结果是内存减少了32MB,而不是64MB。现在,当应用程序需要64MB的内存返回时,内核将块复制(而不移动)到内存中时会发生什么。现在,RAM中有64MB + zram中有32MB。为什么要复制?因为内核按照我在回答中解释的那样缓存页面。两种行为都不理想。而且当内存不能很好地压缩时,情况甚至更糟。
惠更斯(Huygens)

仍处于测试阶段。我认为必须有某种方法可以调整zram在将压缩页复制回未压缩RAM时用于释放压缩页的缓存算法。
极客长老

在2012年之前,我已经尝试过几次了。那时,我的计算机仅限于1GB的RAM,浏览互联网时速度非常慢(我通常会打开10-50个选项卡)。但是从那时起,我再也没有使用它。我有足够多的RAM,不再使用swap。那时,当在Firefox中使用zram时,鉴于我只有很少的RAM,我很快开始“交换”。很快,我的系统反应迟钝,崩溃很多。没有zram的话,它缓慢而缓慢,但至少稳定。我的问题是,它可能一直在压缩/解压缩内存页面。
惠更斯(Huygens)

是的,我的结果有点类似,在具有8GB的系统上,我能够通过在编码工作期间启动多个VM来强制OOM。您有zswap的经验吗?根据我所读的内容,这似乎是一个可行的选择。
年长者怪胎

2

简短的答案:对于zram vm.swappiness=100合适的值(至少在Linux 4.9的Debian Stretch上,我认为这是最好的值)

我已经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$ 

0

当内存已满时,页面需要换出(到磁盘)。如果您使用内存来创建在内存已满时换出页面的位置,那么人们会认为这超出了目的,除非压缩产生了不同(然后自然直接压缩内存而不是通过压缩是很自然的)交换)。猜猜这将是基准测试,因为与内存速度相比,计算机在压缩和解压缩方面的速度越来越快。


当系统内存不足时,我发现zram支持的交换本身非常有用。它使我完全陷入了交换地狱并不得不重新启动的过程中,从而节省了我几次(我正在分析大型数据集,因此我需要全部24 GB的内存)。我只是想知道是否vm.swappiness针对磁盘支持的交换调整了该值,如果我主要使用zram支持的交换,是否应该更改它。
瑞安·汤普森

1
“越来越快”?在过去十年中,动态压缩的性能比直接磁盘I / O更好(它的速度永远不会比内存访问快-这不是重点)
symcbean 2012年

symcbean,您忘记了“与内存速度相比”。分歧在哪里?
亚历山大

我认为symcbean的观点是,压缩内存支持的页面(zram)的目标是取代交换到物理介质。之所以不是“直接压缩内存”是不自然的,是因为应用程序必须确定其内存的哪些部分可以压缩以及何时压缩,这会给应用带来麻烦。VM子系统更容易实现。受益于zram的工作负载的页面不在工作集中,并且可以轻松压缩。
Daniel Papasian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.