Linux 不会丢弃 FS 缓存。相反,内存开始交换

noq*_*qqe 6 linux memory cache swap linux-kernel

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

             total       used       free     shared    buffers     cached
Mem:         15953      14188       1765         64         37      11504
-/+ buffers/cache:       2645      13308
Swap:         2047       1332        715
Run Code Online (Sandbox Code Playgroud)

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

我可以改变这种行为吗?如果是,如何?

cha*_*aos 9

linux 交换算法使用“最近使用的页面”的概念。虚拟内存中的每个页面都有一个与之相关的年龄。如果该页面被频繁访问,那么该页面应该很年轻,而如果一个页面没有被访问,那么该页面就会变老。页面越旧,它们就越有可能被换掉。

因此,如果内核交换了内容,那是因为这些页面的年龄(与其他页面相比)已经过时了。如果所有页面都有足够的物理内存,无论它们的年龄如何,都不会交换任何内容。

内核被配置为以最有效的方式处理他的资源,例如内存和交换,这是可能的。

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

内核文档中关于 的值swappiness

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

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

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;
Run Code Online (Sandbox Code Playgroud)
  • 匿名页面是没有文件或设备支持的内存映射。这就是程序如何从操作系统分配内存以供堆栈和堆之类的东西使用。
  • 文件页面反映了现有文件的内容。

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

您可以按如下方式设置 swappiness:

echo n >/proc/sys/vm/swappiness
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上它根本不是百分比;它是一个权重,与页面缓存(`vfs_cache_pressure`)的权重进行比较,以确定在需要一些内存时是交换还是回收缓存(无论是用于应用程序还是缓存较新的文件数据)。 (2认同)