根据内核文档:
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
从内核版本 2.6.28 开始,Linux 使用拆分最近最少使用的(LRU)页面替换策略。具有文件系统源的页面(例如程序文本或共享库)属于文件缓存。没有文件系统支持的页面称为匿名页面,由运行时数据组成,例如为应用程序保留的堆栈空间等。通常,属于文件缓存的页面从内存中逐出的成本更低(因为这些页面可以在需要时简单地从磁盘读回) 。由于匿名页面没有文件系统支持,因此只要程序需要它们,它们就必须保留在内存中,除非有交换空间来存储它们。
这vm.swappiness
get_scan_count()
选项在定义中发挥作用mm/vmscan.c
。get_scan_count()
确定在查找要逐出的页面时应如何积极地扫描匿名和文件 LRU 列表。每个案例的值由最近旋转和最近扫描的比率的浮动平均值确定,其中较新的参考比较旧的参考具有更大的权重,以便考虑到系统不断变化的工作负载。
这vm.swappiness
是一个修改器,可以改变交换文件缓存页面以支持匿名页面之间的平衡。anon_prio=vm.swappiness
是赋予匿名页面的优先级值,默认设置为 60。文件缓存的优先级值为 200,从中vm.swappiness
扣除修饰符file_prio=200-anon_prio
。这意味着,默认情况下(anon_prio=60
, file_prio=140
),系统认为回收匿名页面的成本是回收文件页面成本的两倍以上。因此, 越低vm.swappiness
,被换出以支持匿名页面的文件缓存页面就越多。然而,当系统接近内存不足的情况,匿名列表和文件 LRU 列表都会同等扫描,除非vm.swappiness
设置为零。
当vm.swappiness
设置为 100 时,优先级将相等 ( anon_prio=100
, file_prio=200-100=100
)。设置vm.swappiness
为零将阻止内核驱逐匿名页面以支持文件缓存中的页面。
答案2
有一个公式用于计算将交换哪个页面。在vmscan.c
你可以看到这个算法:
交换趋势=mapped_ratio/2+痛苦+vm_swappiness
在这里你可以看到 swappiness 是一个尺度,它是在某些算法中添加的,你可以通过这个参数控制内核在必须交换时的行为方式。您可以将其计算为某些不活动内存页面将被交换的概率百分比。如果将 swappiness 设置为 100,则没有概率,但保证会交换,如果将其设置为 0,则只要有一些空内存,内核就会尝试根本不进行交换。
答案3
有人说(我想是 Norman 1986),电梯中的“关门”按钮通常要么坏了,要么从一开始就没有连接到任何东西。这使得替代控制不再是操纵电梯的一种方式,而是安抚过于匆忙的乘客的方式。
以类似的方式,交换性具有与其对内核谓词的明确定义的确定性控制无关的效果。正如所指出的askubuntu.com 上的 @neon_overlord
因为大多数人认为交换 = 不好,并且如果不减少交换性,系统就会在真正不需要的时候进行交换。这些都不是真的。人们将交换与系统陷入困境的时间联系在一起 - 然而,交换主要是因为系统陷入困境,而不是相反。确实,在某些时候交换可能会产生明显的损失,但在这种情况下减少交换可能会以其他方式降低整体系统性能或稳定性,这些方面稍后可能会变得明显......
那么它有什么作用真的控制?除了已经提供的好的答案之外,一个有效的答案是,它改变了您对系统有更多控制权的期望,并且转动旋钮将允许您以一种有意义的方式施加这种控制。