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

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

我做了一个简短的cron命令来自动化这个,我有很好的结果:

 #! /bin/sh echo "* */1 * * * root swapoff -a && swapon -a" >> /etc/crontab 

但是因为它更多的是一个技巧而不是真正解决这个问题的方法,我想知道它可能是一个坏主意的潜在原因,或者我怎么能改进这个脚本以使它更聪明一点?

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

另外:你确定吗? 交换分配并不意味着使用交换。 命令vmstat ,列si (交换) so (换出)。 如果那些仍为0,你会遇到另一个问题。 根据我的经验,很少使用交换,你可能没有使用它认为它不会清空它,但没有什么可以清空。

我会说这是一个坏主意。 如果你认为你有空闲内存并且没有将活动进程从交换移动到RAM,那么要么你没有你想象的那么多可用内存,要么这个进程没有你想象的那么活跃。是。

如果继续交换活动进程,则应该修复导致内存压力的任何内容。 如果它不是一个活跃的过程,那有什么大不了的?

这是个坏主意。

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

通常,这种情况主要发生在长时间未访问的页面上,这是一个很好的指示,它不太可能很快被访问。

如果您明确地丢弃副本,那么没有任何好处,因为数据仍然存在于RAM中,但是当某个进程想要分配大量内存并且交换变得必要时,可能会花费您的速度。

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

这是一个坏主意。 如果这很有用,Linux内核将以这种方式实现它。 我认为没有理由改变一些调整参数,因为这样一个简单的shell脚本很可能不比内核开发人员的算法更聪明。

你基本上有两种情况:

  • 无论如何都不使用交换空间中的进程。 你为什么要把它们拉回内存?
  • 内存很少,所以它们会被换出,然后将它们拉回RAM。 然后你的系统会尽快再次交换它们。

所以有两个要点:

  1. 首先,当RAM太少而无法一次运行所有程序时,系统会很慢。 Swap将帮助您运行更多程序,但不能快速切换到很少使用的程序,这可能会被换出。 没有交换可能会使很少使用的一个被杀死,或者发送当前使用的一个内存exception。
  2. 第二,交换是一件好事,因此在交换中有一些东西,因为你有免费的RAM,但是你目前还没有使用的程序。

尽管没有太多程序出现内存不足的问题,但有些程序可能会根据当前空闲的RAM分配内存(也许你的浏览器会使用更多的内存缓存,你可以更快地浏览)内核可以使用免费的RAM进行磁盘缓存。类似的优化。 当您强制交换为空时,内核将删除其读取缓存,例如,启动新的Firefox实例将比Firefox仍在磁盘缓存中的时间更长。

如果要调整内核的行为,请参阅swappiness参数 。

另外两个资源由@ peter-cordes提供:

如果您真的想要空交换,可以永久关闭交换。 我不明白为什么让它持续一个小时然后清空它比没有交换有优势。

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

 echo 3 > /proc/sys/vm/drop_caches 

这样你就可以避免可能的内存不足的短暂时刻,让内核决定什么是必要的,什么可以丢弃。

与常见的想法相反,SWAP本身并不坏
实际上减慢系统运行速度的是内核活动,它将数据从RAM移动到SWAP并返回到RAM中,即swappiness
系统在配置swappiness自动执行此swappiness
这使得来自非活动进程的内存被转储到硬盘交换分区。
我自己多年来一直使用没有那么多RAM内存的机器,而且我总是使用一些SWAP内存。 仍然我的机器工作正常,直到你开始将内存移回RAM,也许是试图关闭一个打开的应用程序。 然后工作负荷开始增加。

  • 因此,通过不断清理您的SWAP内存,您机器上的工作负荷将大大增加。
  • 在SWAP分区上运行具有内存的应用程序可能会在执行时损坏。

相反,我建议你研究哪个应用程序使用htop应用程序在命令行上使用你的内存并决定关闭一些应用程序。 gnome-system-monitor也可以在Process-Tab中为您提供良好的洞察力。
如果你有大量的应用程序使用大量的RAM。 不要一次全部运行它们。