Linux 不会删除 FS 缓存。相反,内存开始交换

Linux 不会删除 FS 缓存。相反,内存开始交换

我对 Linux 内存缓存的这种行为感到很困惑。

             total       used       free     shared    buffers     cached
Mem:         15953      14188       1765         64         37      11504
-/+ buffers/cache:       2645      13308
Swap:         2047       1332        715

非缓存内存不应该优先于缓存吗?换句话说:为什么机器要交换到磁盘,而不是删除缓存。

我可以改变这种行为吗?如果是,怎么办?

答案1

Linux 交换算法采用“最近使用的页面”的概念。虚拟内存中的每个页面都有一个与其关联的年龄。如果该页面被频繁访问,则该页面的年龄应该相当年轻,而如果页面没有被访问,则该页面会变得较旧。页面越旧,它们被换出的可能性就越大。

因此,如果内核交换出内容,那么这是因为这些页面的年龄(与其他页面相比)很旧。如果所有页面都有足够的物理内存,无论其年龄如何,都不会交换任何内容。

内核被配置为以最有效的方式处理其资源,例如内存和交换区。

我认为你不应该改变这种行为。但是,如果您愿意,您可以更改系统交换性。 swappiness 设置为 0 意味着除非绝对必要(内存不足),否则将避免使用磁盘。

来自内核文档关于 的值swappiness

该控制用于定义内核交换内存页面的积极程度。较高的值会增加攻击性,较低的值会减少交换量。值 0 指示内核不要启动交换,直到空闲页面和文件支持页面的数量小于区域中的高水位线。

在linux内核源代码中的文件vmscan.c处理交换值。这是有趣的部分:

2018         /*
2019          * With swappiness at 100, anonymous and file have the same priority.
2020          * This scanning priority is essentially the inverse of IO cost.
2021          */
2022         anon_prio = swappiness;
2023         file_prio = 200 - anon_prio;
  • 匿名页面是没有文件或设备支持的内存映射。这就是程序从操作系统分配内存以供堆栈和堆等使用的方式。
  • 文件页镜像现有文件的内容。

正如您在上面的源代码片段中看到的,交换文件页面的优先级(默认值为 60)高于交换匿名页面。但是,如果设置为 100,则两个值具有相同的优先级。如果设置为 0,则优先级差异尽可能大。

您可以按如下方式设置交换性:

echo n >/proc/sys/vm/swappiness

... n0-100 之间的值在哪里。

相关内容