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

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

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

评论

@Mat有关如何执行交换基准测试的信息,请参见。

#1 楼

从内核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.swappiness设置为0将阻止内核逐出匿名页面,而支持文件缓存中的页面。如果程序自己进行大部分缓存,则这可能很有用,某些数据库可能就是这种情况。在台式机系统中,这可能会改善交互性,但是缺点是I / O性能可能会受到影响。

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

评论


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

– Gerrit
16年7月1日在10:50

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

–托马斯·尼曼(Thomas Nyman)
16-09-30在20:02

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

– MatrixManAtYrService
17-2-10在1:40



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

–托马斯·尼曼(Thomas Nyman)
17年2月10日在11:38

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

– MatrixManAtYrService
17年2月13日在21:55



#2 楼

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

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

本文还可以使您对该主题有所了解。特别是,如何估计交换趋势。

评论


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

–雨果
13年8月29日在13:37

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

–重播
13年8月29日在13:39

#3 楼

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


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


评论


最终用户系统对SSD写入持久性的担忧被高估了。现代SSD通常可以承受数百TB的写入量。即使具有大量交换使用的典型台式机系统,在多年的运行中也不太可能使用那么多。

–法律
17年7月4日在8:59