多年来,我的小型 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
这样,您可以避免可能出现的短暂内存不足,并让内核决定什么是必要的,什么可以丢弃。