vm.swappiness参数真正控制什么?


36

根据内核文档:

This control is used to define how aggressive the kernel will swap
memory pages.  Higher values will increase aggressiveness, lower values
decrease the amount of swap.

但这有点含糊。我试图弄清楚参数最终控制什么。我知道它会调整内核尝试换页的积极程度,但是它会影响内核代码中的哪些决策过程?

它会调整内核换出之前必须访问页面多长时间吗?如果是这样,默认值60代表什么?增减1会改变多少(一个公式会很好)?
还是根据访问频率交换页面?
或者是其他东西?


1
是的,swapiness 模糊;-)
ℝaphink

Answers:


27

从内核版本2.6.28开始,Linux使用最近最少分裂(LRU)页面替换策略。具有文件系统源(例如程序文本或共享库)的页面属于文件缓存。没有文件系统支持的页面称为匿名页面,由运行时数据(例如为应用程序保留的堆栈空间等)组成。通常,属于文件高速缓存的页面从内存中逐出的成本较低(因为可以在需要时从磁盘简单地读取这些页面) 。由于匿名页面没有文件系统的支持,因此程序必须将它们保留在内存中,直到有交换空间来存储它们为止。

vm.swappiness选项在中get_scan_count()定义的中起作用mm/vmscan.cget_scan_count()确定在寻找要逐出的页面时应如何积极地扫描匿名和文件LRU列表。每种情况的值由最近轮换的比率和最近扫描的比率的浮动平均值确定,在这种情况下,考虑到系统不断变化的工作量,较新的引用比旧的引用具有更大的权重。

vm.swappiness是改变有利于匿名页面的换出的文件缓存页之间的平衡调节剂。vm.swappiness是赋予匿名页面的优先级值,默认设置为60。文件高速缓存的优先级值为200,从中vm.swappiness减去修饰符(file_prio=200-anon_prio)。这意味着,在默认情况下,优先级权重架适度赞成匿名页面(的anon_prio=60file_prio=200-60=140)。但是,当系统接近内存不足的情况时,除非vm.swappiness将其设置为零,否则匿名和文件LRU列表都会被平等地扫描。

vm.swappiness设置为100时,优先级将等于(anon_prio=100file_prio=200-100=100)。设置vm.swappiness为零将防止内核从文件高速缓存中逐出匿名页面,而改用匿名页面。


有没有办法改变file_prio的交换性?还是将其限制为特定目录?
CMCDragonkai 2014年

13

有一个公式可用于计算要交换的页面。在其中vmscan.c您可以看到此算法:

交换趋势=映射比率/ 2 +遇险+ vm_swappiness

在这里,您可以看到swappiness是一个比例,它是在某种算法中添加的,并且可以通过此参数控制内核在必须交换时的行为。您可以将其表示为将交换一些非活动内存页面的概率的百分比。如果将swappiness设置为100,则没有可能性,但是保证它将交换,如果将其设置为0,则内核将尝试完全不交换,只要它有一些空的内存即可。


6

有人说过(我认为是Norman 1986),电梯中的“ CLOSE DOOR”(关闭门)按钮通常是坏的,或者从来没有连接到任何东西。这使得ersatz控制不是操纵电梯的一种方式,而是使过度忙碌的骑手得到安抚的方式。

以类似的方式,交换性的作用与其对内核谓词的定义明确的确定性控制无关。正如@neon_overlord在askubuntu.com上指出的那样

因为大多数人认为交换=不好,并且如果您不减少交换问题,那么系统将在真正不需要时进行交换。这些都不是真的。人们将交换与他们的系统陷入困境的时间联系在一起-但是,这主要是因为系统在陷入困境,而不是相反。确实,在某些时候交换可能会带来明显的损失,但是在这种情况下减少交换可能会以其他方式降低整体系统性能或稳定性,这以后可能会变得明显起来……

那么,它真正控制什么呢?一个有效的答案(除了已经提供的好的答案之外)是,它改变了您对系统有更多控制权的期望,并且旋转旋钮将使您能够以有意义的方式发挥这种控制作用。

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.