我对 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
... n
0-100 之间的值在哪里。