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)
不应该有非缓存内存优先于缓存吗?换句话说:为什么机器交换到磁盘,而不是丢弃缓存。
我可以改变这种行为吗?如果是,如何?
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 之间的值在哪里。