我想部署以下交换策略:
- 默认情况下,内存中的所有页面也应该位于交换空间中。
- 当内存中的页面发生更改(即脏)时,应尽快将该页面写出,但优先级低于其他进程。
- 如果达到某个可配置的水位线(假设 80% 的页面是脏页),则优先级将与其他进程相同。
这种交换策略在 Linux 内核中可行吗?如果可以,我该如何设置内核设置来实现这一点?
编辑:
显然这样做的原因是为了减少需要换出的页面数量。只有脏页需要写入磁盘,并且随着时间的推移,这会在后台发生。因此,当发生页丢失(即该页不在内存中)时,不需要将任何页从内存写入到磁盘,而只需从磁盘写入到内存。因此,它降低了出现 I/O 瓶颈的可能性,因为换入和换出都会尝试同时访问磁盘。
答案1
您可以设置 的值/proc/sys/vm/swappiness
来控制交换的数据段与保留在内存中的数据段的比率。值为 0 会不惜一切代价完全避免交换。
这可以使用以下任一方法来完成:
echo 0 > /proc/sys/vm/swappiness
sysctl -w vm.swappiness=0
- 将该设置存储在
/etc/sysctl.conf
一般来说,使用一点点交换并不是一件坏事。空闲内存可用于缓存从磁盘读取的数据,并且系统可以针对应用程序突然需要大量内存而提前计划。
然而,当交换太多程序时,每次程序切换期间都会有大量与磁盘相关的活动,这确实会使一切变慢。在使用某些东西之前,需要将其加载回内存中。
与内存访问相比,磁盘读取速度非常慢,因为数据到达所需的时间要长得多。系统必须在其他读/写请求之间安排读取,驱动器开始尝试找到正确的柱面,最后开始缓慢传输数据。
因此,我认为你的逻辑是有缺陷的。通常,您希望让程序在内存中运行,同时仍为突然增长保留足够的空间。不要过于频繁地使用交换来“将内容写入磁盘”,因为它既不是备份也不是性能改进。
较旧的计算机内存较少,因此会出现交换问题。当同时打开许多程序时,系统会变慢,并且您可以听到磁盘读写交换文件的声音。
答案2
仅仅因为您的系统正在交换,并不意味着您有问题。有些应用程序经过精心调整,可以充分利用交换,而不会影响系统的性能。大多数关系数据库系统都是这样调整的: IE:Oracle 和 Cache,可能是最大的两个。
如果您使用休眠模式,它会使用交换空间来存储 RAM。当系统重新启动时,交换区中的所有内容都会添加回 RAM。这样,您就可以关闭系统电源,而无需像待机那样耗尽电池,并且仍然可以返回到关闭电源之前离开的位置。因此,您的电池将持续更长时间。
交换可能是一件很棒的事情,因为它可以释放更多的活动 RAM,以保持系统的高性能。当您的活动 RAM 已满且交换区已满,并且您仍然需要更多空间时,只有那时您才会遇到问题。在那之前,交换是为了帮助你,而不是伤害你。
答案3
添加到 vdboor 的答案,我认为要实现你想要的,你需要修改超过swappiness
.有更多可用的内核可调参数可以控制交换的使用方式。用户可以在运行时通过/proc/sys/vm/*
文件访问这些内容或永久设置/etc/sysctl.conf
(这可能需要将sysctl
init 脚本添加到启动序列中才能生效)
Linux 内核文档中详细介绍了这些设置。您可以在下面找到它<your_kernel_sources_path>/Documentation/sysctl/vm.txt
。您还可以查看一些在线文档比如这个。