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


26

多年以来,我的小型Ubuntu配置一直遇到相同的问题:所使用的交换空间随时间增加。我的印象是,这主要是因为分配的内存即使有足够的空间也永远不会返回RAM,除非用户操作(如禁用交换)。

我做了一个简短的cron命令来自动化它,并且我得到了很好的结果:

#! /bin/sh

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

但是,由于这不是真正解决该问题的技巧,所以我想知道它可能不是一个好主意的潜在原因,或者我该如何改进此脚本以使其更聪明?


29
请原谅我的无知,但是您说空间SWAP随着时间的增长以及分配给内存的RAM的清空是什么意思呢?通常,您为系统分配一些空间作为交换空间,而再也不会听到它的声音。谁在乎实际进行了多少交换?有什么问题?
甜点

5
你为什么还要这么做?您为什么认为某些交换使用是一件坏事?我们在谈论多少交换使用?
marcelm '17

25
我有点不解。您一直在谈论“问题”,但实际上并未描述任何形式的负面影响。您为什么认为这是一个问题?
David Schwartz

17
如果有东西进入交换区并停留在那里,那是因为没有人在使用它。而如果不使用它,这是更好地让RAM用于的东西访问,诸如高速缓存,而不是交换的数据备份。
霍布斯

12
与仅放弃交换相比,这有什么好处?
user253751 '17

Answers:


51

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

另外:您确定吗?分配交换并不意味着正在使用交换。命令vmstat,列si(交换)和so(交换)。如果这些值仍然为0,则会出现另一个问题。根据我的经验,几乎不使用交换,并且您可能不会使用它,因为它不会清空它,但是没有什么可清空的。


3
等等什么 如果没有足够的内存使交换成功,则交换将首先被OOM杀手杀死。是的,他们实际上对此进行了硬编码(通过系统调用进行检查)。
约书亚

@Joshua当然可以,但是他希望它能够自动运行。没有错误了。
林茨温德

4
不用写我自己的答案就可以详细说明,随着时间的推移交换使用量的增长并不是一件坏事。这意味着内核正在慢慢地发现正在消耗内存的垃圾永远不会被使用,并将其移出以进行交换,以便内存可以用于对您有实际帮助的事情(例如能够保留更多的fs数据从而它不必一直丢弃它并从磁盘重新读取它)。
R.,

@Rinzwind cron可以很好地处理有错误的作业,并且链接的脚本也不使用vmstat
jpaugh

41

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

如果活动进程继续被交换,则应修复造成内存压力的任何原因。如果这不是一个积极的过程,那有什么大不了的?


1
+1:有什么大不了的?永远不要更改正在运行的系统,我不认为这样的系统会干扰核心功能,尤其是没有必要的情况下。
甜点,

3
有时我遇到一些问题,即我因内存泄漏杀死了一个进程(这迫使其他所有事物都掉入了交换空间),使我只能使用约10%的RAM ...但是所有正在运行的程序都处于交换状态,直到我再次访问它们为止。因此,每当您触摸某物时,都会有两秒钟的延迟。我可以看到OP的来源,自动完成会很不错,但这不是正确的方法。
某处某人

1
@SomeoneSomewhere但这不是它的工作方式。如果该进程正在泄漏内存,那么根据定义,它不是在主动使用该内存(它不是在读写)。它只是偶然分配了。如果周围还有其他活动进程,则泄漏的内存将被换出,这将是充满垃圾的交换,而不是物理RAM。
David Richerby '11

@DavidRicherby如果您在后台打开了一个程序,那么该程序的活动性仍然不如内存泄漏-当您切换回该程序时,它必须退出交换。
某处某人

@SomeoneSomewhere您似乎误解了内存系统的工作方式。您不必将整个过程都放在物理RAM中:交换是按单个页面的粒度进行管理的。一段时间未使用的任何页面都容易被换出,并且完全由泄漏的内存组成的页面将永远不会再次使用,因此换出后也永远不会被换回。
David Richerby '17

34

这是一个坏主意。

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

通常,这种情况主要发生在长时间未访问的页面上,这很好地表明了不太可能很快访问它们。

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

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


4
always:我认为您假设将/proc/sys/vm/swappiness其保留为默认值70,这对服务器很有用,并且可以从没有接触过一段时间的进程中积极地调出脏页,以便为更多的页面缓存腾出空间。这通常对台式机不利,因为alt-tab会变慢。
彼得·科德斯

@PeterCordes,如果实际上驱逐了页面,则与相关应用程序页面相比,缓存具有更多的访问权限,因此使用这些磁盘作为磁盘缓存有一个净收益。与大型项目的编译时间相比,我可以看到Alt-Tab的性能对用户来说是更可见的,但是发现很难制定一种保证即时响应而又不牺牲太多性能的策略。
西蒙·里希特

1
换句话说,内核已针对吞吐量(swappiness=70)进行了调整,但是延迟对于台式机上的用户体验而言更为重要。这是一个权衡。如果您通常编译的东西太大而无法保留在页面缓存中,那么可以肯定的是,将swappiness其保留得更高一些,例如20或30,而不是5或10。另请参见akitaonrails.com/2017/01/17/optimizing-linux-for -慢速计算机。看到vm.vfs_cache_pressure低于100还倾向于在数据页面上缓存inode /目录元数据,这也有利于UI响应。
彼得·科德斯

1
其他可调参数:回写阈值lonesysadmin.net/2013/12/22/…。这些控制着Linux在东西写入文件后多快开始写入磁盘,以及允许多少脏页。(即可以在写缓存上花费多少内存)
Peter Cordes

21

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

您基本上有两种情况:

  • 交换空间中的进程始终不使用。为什么要将它们拉回RAM?
  • RAM很少,因此它们被换出,然后将它们拉回到RAM中。然后,系统将尽快将它们重新置于交换状态。

因此,有两个要点:

  1. 首先,如果RAM太少而无法一次运行所有程序,则系统速度将会很慢。交换将帮助您运行更多程序,但不能快速切换到很少使用的程序,后者可能会被交换掉。任何交换都不会杀死很少使用的交换机,也不会向当前使用的交换机发送内存不足的异常。
  2. 其次,交换是一件好事,交换中也是有好处的,因为您有可用的RAM,但要以当前不使用的程序为代价。

尽管没有太多程序带来内存不足的问题,但是某些程序可能会基于当前的可用RAM分配内存(也许您的浏览器将使用更多的内存缓存,并且您可以浏览得更快),并且内核可以使用空闲的RAM进行磁盘缓存和类似的优化。当您强制交换为空时,内核将删除其读取缓存,例如,启动新的Firefox实例将比Firefox仍位于磁盘缓存中的时间更长。

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

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

如果您确实要清空交换,可以永久关闭交换。我不明白为什么将其打开一个小时然后将其清空比没有交换具有优势。



5

通过告诉内核释放缓存,可以达到相同的结果:

echo 3 > /proc/sys/vm/drop_caches

这样,您就避免了可能出现内存不足的短暂时刻,并让内核来决定什么是必要的以及哪些可以被丢弃。


0

与普遍看法相反,SWAP本身也不错
实际上减慢系统速度的是内核活动,该活动将数据从RAM移至SWAP,然后又移回到RAM中swappiness
系统使用进行了自动配置swappiness
这使得来自非活动进程的内存被转储到硬盘交换分区。
我本人在没有太多RAM内存的机器上工作了多年,而且我总是使用一些SWAP内存。在您开始将内存移回RAM之前,我的机器仍然运行良好,也许是通过尝试关闭打开的应用程序。然后工作量开始增加。

  • 因此,通过不断清除SWAP内存,机器上的工作量将大大增加。
  • 正在SWAP分区上有其内存的正在运行的应用程序的执行可能会损坏。

相反,我建议您仔细研究哪个应用程序在htop应用程序的命令行上使用您的内存,然后决定关闭某些应用程序。该gnome-system-monitor可以给你很好的启示,以及在其进程表中。
如果您有使用大量RAM的大型应用程序。不要一次运行它们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.