![当 CPU 使用率较低时,有没有办法强制 Linux 取消交换?](https://linux22.com/image/69365/%E5%BD%93%20CPU%20%E4%BD%BF%E7%94%A8%E7%8E%87%E8%BE%83%E4%BD%8E%E6%97%B6%EF%BC%8C%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E5%BC%BA%E5%88%B6%20Linux%20%E5%8F%96%E6%B6%88%E4%BA%A4%E6%8D%A2%EF%BC%9F.png)
在我的机器上工作一天多后,swap 变成了大约 1GB。我的一些面板插件会进行交换,因此它们变得缓慢。此外,在我做到这一点之前,系统不会取消交换swapoff -all;swapon --all
。 Linux 内核中是否有在负载较低或类似情况下取消交换的机制?
swapoff -all;swapon --all
有时 RAM 的使用量达到 90%,因此编写每小时执行一次的脚本是一个坏主意。
答案1
可能您的默认交换值是 60。将其减少到 10,以减少交换对内存的偏好,然后监视此后的行为。
echo 10 > /proc/sys/vm/swappiness
要使其永久化(即在重新启动后继续存在),请编辑/etc/sysctl.conf
并添加此行
vm.swappiness = 10
有关此参数的更多信息可以在以下位置找到维基百科:交换性。
答案2
当Linux需要寻找RAM来存储某些内容时,它会查找RAM中最长时间未使用的页面。如果这些页面属于文件,它们将被释放。如果这些页面是进程内存,它们将被移至交换区。
Linux 不知道哪些页面将很快被使用,并且不知道哪些页面将很快被需要(例如,交互式程序是反应性的)。我认为没有任何方法可以为特定进程提供保留在 RAM 中的优先级。页面可以锁定到 RAM(这需要 root 或适当的功能),但不建议将内容锁定到 RAM,因为这样会减少其余部分的空间。
您可以通过以下方式强制将特定进程加载到 RAM 中读取它的内存— 看我的unswap
脚本。
你可以减少交换倾向通过设置vm.swappiness
sysctl 参数。但是,请注意,减少交换性并不能保证让您的系统变得更快。这并不奇怪:如果您的系统交换量较少,它会花费更多时间从文件(例如程序代码)加载数据。
如果您有相对较大的内存,我发现在 3.0–3.16+ 内核中默认情况下没有很好调整的一个设置是另一种设置vm sysctl 参数: vm.vfs_cache_pressure
。该参数有点类似于 swappiness,但涉及内核对象,特别是 inode 和 dentry 缓存。增加该值可有效减少专用于该缓存的内存量。您可以使用slabtop
或 with查看 inode 和 dentry 缓存使用了多少内存
</proc/slabinfo awk '{print $1, $3*$4}' |sort -k2n | tail
如果您发现早上系统运行缓慢,这可能是因为夜间 cron 作业(例如updatedb
用 inode 缓存条目填充了内存)。尝试类似的东西sysctl vm.swappiness=500
。您可以对缓存进行一次性刷新echo 2 >|/proc/sys/vm/drop_caches
(不要定期执行此操作,因为它会降低性能)。