创建一个每小时清空交换空间的 cron 脚本是一个坏主意吗?

创建一个每小时清空交换空间的 cron 脚本是一个坏主意吗?

多年来,我的小型 Ubuntu 配置一直存在同样的问题:使用的交换空间会随着时间的推移而增加。我觉得这主要是因为分配的内存永远不会返回到 RAM,即使有足够的空间,除非用户执行了禁用交换之类的操作。

我编写了一个简短的cron命令来自动执行此操作,并获得了良好的结果:

#! /bin/sh

echo "* */1 * * * root swapoff -a && swapon -a" >> /etc/crontab

但因为这更像是一个技巧而不是这个问题的真正解决方案,所以我在想这可能是一个坏主意的潜在原因,或者我如何改进这个脚本使它变得更聪明?

答案1

这样使用:是的,不好。在关闭交换之前,您确实需要检查是否有足够的内存可用。请参阅https://askubuntu.com/a/90399/15811以获得更好的版本。

另外:你确定吗?分配交换并不意味着使用交换。命令vmstat,列si(交换入)和so(交换出)。如果这些仍为 0,则会出现另一个问题。根据我的经验,交换很少使用,您可能不会使用它,认为它不会清空它,但实际上没有东西可清空。

答案2

我认为这是个坏主意。如果您认为有可用内存,而活动进程没有从交换移至 RAM,则要么您没有像您想象的那么多可用内存,要么该进程没有您想象的那么活跃。

如果活动进程继续被交换,则您应该修复造成内存压力的因素。如果它不是活动进程,那有什么大不了的?

答案3

这是一个坏主意。

内核在物理内存即将填满之前就开始将数据复制(而不是移动)到交换区,因为如果某个进程需要大量内存,那么任何在交换区中已有有效副本的页面都可以立即重用,而无需再次写入磁盘。

一般来说,这种情况主要发生在那些很长时间没有被访问的页面上,这很好地表明这些页面不太可能很快被访问。

如果您明确丢弃副本,则不会带来任何好处,因为数据仍然存在于 RAM 中,但是当某些进程想要分配大量内存并且需要进行交换时,可能会降低速度。

一旦物理内存的使用量超过 50%,内核也将始终使用交换空间,因此即使您安装了足够的内存,这些数字也不会为零。

答案4

您可以通过告诉内核释放缓存来获得相同的结果:

echo 3 > /proc/sys/vm/drop_caches

这样,您可以避免可能出现的短暂内存不足,并让内核决定什么是必要的,什么可以丢弃。

相关内容