为什么默认将swappiness设置为60?


109

我刚刚读了一些有关Linux上交换性能的内容。我不明白为什么默认设置为60。

据我说,该参数应设置为10,以减少交换。交换位于我的硬盘驱动器上,因此它比内存慢得多。

他们为什么要这样配置内核?


2
@Mat见怎么办swappiness标杆。
Geremia

Answers:


133

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

常见的误解是交换分区会以某种方式降低系统速度。没有交换分区并不意味着内核不会从内存中逐出页面,而只是意味着内核对于要逐出哪些页面的选择较少。可用的交换数量不会影响使用的数量。

Linux可以应对交换空间的不足,因为默认情况下,内核内存记帐策略可能会过量使用内存。不利之处在于,当物理内存耗尽时,内核无法将匿名页面交换到磁盘时,内存不足杀手(OOM-killer)机制将开始杀死消耗内存的“流氓”进程,以释放内存用于其他过程。

vm.swappiness选项是一个修饰符,用于更改换出文件缓存页面之间的平衡,而使用匿名页面。文件高速缓存具有200的任意优先级值,并从中vm.swappiness扣除修饰符(file_prio=200-vm.swappiness)。默认情况下,匿名页面以60(anon_prio=vm.swappiness)开始。这意味着,在默认情况下,优先级权重有利于匿名页面(中脱颖而出适度anon_prio=60file_prio=200-60=140)。该行为mm/vmscan.c在内核源代码树中定义。

给定vm.swappiness100,优先级将等于(file_prio=200-100=100anon_prio=100)。如果不希望将文件高速缓存中的页面逐出匿名页面,则对于I / O繁重的系统来说这是有意义的。

相反vm.swappiness0将设置为to 将防止内核从文件高速缓存中逐出匿名页面,而转而使用匿名页面。如果程序自己进行大部分缓存,则这可能很有用,某些数据库可能就是这种情况。在台式机系统中,这可能会改善交互性,但缺点是I / O性能可能会受到影响。

默认值很可能被选择为这两个极端之间的近似中间值。与任何性能参数一样,调整vm.swappiness应基于与实际工作负载相当的基准数据,而不仅仅是直觉。


4
在固态设备上安装操作系统如何影响权衡?
Gerrit '16

3
@gerrit底层存储介质的类型无关紧要。内存管理子系统看不到这种详细信息。
Thomas Nyman

从内存使用的角度来看,底层存储介质的类型无关紧要。您可以考虑降低介质支持有限数量的读/写(即闪存)的交换能力,以增加其使用寿命。
MatrixManAtYrService

2
@MatrixManAtYrService由于具有内部损耗均衡和内置冗余功能,因此现代SSD(上一条注释中提到的问题) 已显示出在出现错误之前最多可写入2 PB(!)。在这些实验中,即使是更便宜的驱动器在出现错误之前也能持续使用300TB,远远超出了官方的100TB左右的保修等级。至少在我看来,真的没有必要对交换性进行调整以适应工作站或笔记本电脑上的SSD。
Thomas Nyman

2
@ThomasNyman,您的观点很不错,对于大多数用户来说,这并不值得担心。将我带到此职位的案例涉及SD卡上的交换空间,我认为这是一个边缘案例。
MatrixManAtYrService

9

问题在于,没有一个默认值可以满足所有需求。将swappiness选项设置为10可能是适用于台式机的设置,但是默认值60可能更适合服务器。换句话说,需要根据用例(桌面与服务器,应用程序类型等)来调整可交换性。

此外,Linux内核将内存用于磁盘缓存,否则将不使用RAM,这既无效又无意。将磁盘数据保存在缓存中意味着,如果某些内容再次需要相同的数据,则很可能会从内存中获取数据。从那里获取数据比从磁盘再次获取数据要快得多。swappiness选项是一种机制,Linux内核更愿意换出到磁盘以减少磁盘缓存。是从缓存中删除旧数据还是换出某些程序页面?

本文也可能为该主题提供一些启示。特别是,如何估计交换趋势。


我不明白为什么60更适合服务器。我确实有服务器,并且即使有40%的freem RAM,也有一些进程进行交换。对我来说没有意义。
雨果

7
如果不太可能要访问它们,则将部分内存移入交换区是有意义的,这样Linux会尽可能多地保留实际的可用RAM,以备实际需要时使用。
重播


文章的链接是死了,但你仍然可以从查看Wayback机器
DRS

链接的文章内容丰富。感谢分享。
Pistos

5

在以上答案中添加更多细节。
随着我们越来越多地使用VM,Linux主机可能是这些云环境之一上的VM。在示例1和示例2中,我们对应用程序的运行以及它们消耗了多少RAM都有很好的了解。3,不是很多

  • 示例1:
    一种高性能的私有云(想想大多数银行会花几百万美元购买的云),其中磁盘是由非常昂贵的IO组成的非常昂贵的存储阵列提供的。该存储的一部分可能在由SSD磁盘支持的RAM(在磁盘阵列中),由带轴的常规磁盘支持的RAM中。在这种情况下,VM可以看到的磁盘可能仅比其可以访问的RAM慢一点。对于单个虚拟机,交换和内存之间没有太大区别。
  • 例子2
    与示例1相同,但是您拥有数百个,数千个或更多的虚拟机,而不是单个虚拟机。在这种情况下,我们发现服务器(管理程序)RAM便宜且数量很多,而存储RAM则相对昂贵(相对而言)。如果我们在非常昂贵的存储阵列提供的Hypervisor RAM和SWAP之间划分RAM需求,我们会发现我们很快使用了存储阵列中的所有RAM,然后由SSD以及最终由主轴提供块服务。突然,每个开始变得非常缓慢。在这种情况下,我们可能想为虚拟机分配足够的RAM(从虚拟机管理程序),并将swappiness设置为0(仅交换以避免内存不足的情况),因为所有这些vm的累积影响将影响虚拟机的性能。存储,
  • 示例3可能带有SSD的现代笔记本电脑或台式机。内存要求被认为是未知的。用户将使用哪种浏览器,将打开多少选项卡,还将编辑文档,RAW图像或可能是视频的图像,它们都将占用RAM。将swappiness设置为低值并执行其他文件系统调整将意味着对SSD的写入减少,因此它将持续更长的时间。

3
最终用户系统对SSD写入耐久性的担忧被高估了。现代SSD通常可以承受数百TB的写入量。即使使用大量交换,典型的台式机系统也无法在很多年的运行中使用太多。
Jules'July
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.