如何完全禁用掉期?


30

我正在使用Debian sid(用ext4格式化的硬盘),在Linux 3.1上运行

我记得在以前的linux版本(可能在3.0之前)上,如果内存不足,并且未启用swap,程序通常会崩溃。这非常适合我的环境:简单的Web浏览,无任何关键操作。就是说,如果我不小心遇到了一个占用过多内存的不良网站,它只会崩溃而不会导致我的终端无法使用。

但是在我当前的设置中,计算机在后台挂起时具有严重的I / O吞吐量。iotop揭示kswapd0是罪魁祸首,这意味着它是由于交换引起的。在swapon -s用于确定已启用的swapoff -a所有交换之后,我曾经禁用了所有交换,然后swapon -s再次确认所有交换均被禁用。

然后,我尝试再次最大化内存使用率。las,我所期望的行为没有发生。相反,kswapd0会反复尝试换出RAM,并且由于没有交换空间而失败。因为它永远不会放弃,所以我的计算机陷入了永久性的I / O严重冻结,这对磁盘的运行状况不利。

我尝试做错什么了swapoff -a吗?为什么该行为与以前不同(可能是3.0倍之前)?


那真的没有道理。如果交换中有东西,那么执行swapoff -a 本身将产生大量的I / O(如果没有足够的实际RAM,可能会导致进程被杀死)。您确定不是swapoff -a引起I / O“风暴”的原因吗?

1
我认为足以评论fstab关于交换的内容。尝试是否行为相同。
enzotib

@Mat swapoff -a应该永久禁用交换,这意味着它应该在下次重新启动后保持禁用状态。我确认了 但是,下一次重新引导后的会话期间仍会发生I / O“风暴”。作为记录,我当时没有发生I / O“风暴”,因为那时swapoff -aswap为0。
syockit

9
@syockit:swapoff -a不是永久的。

1
在14小时内,数据库加载量达到了大约15%。关闭交换,然后在下次尝试中在4小时内达到40%。公认的是,服务器的电源不足且ram功耗较低,但是在未打开交换功能的情况下,OpenSuSE在此过程中的运行速度要快得多。在简单的mysql db加载期间,操作系统对“更好”和我的看法的差异很大。注释掉/ etc / fstab中的交换驱动器,然后重新启动。
TheSatinKnight

Answers:


15

禁用交换功能将无法执行您想要的操作。您仍将获得猛烈的I / O吞吐量,但这将是干净的页面,而不是脏的页面。

如果不进行交换,则系统会将干净(未修改)页面的缓存压缩到接近零,因为这些是它可以从物理内存中退出的唯一页面。它只能通过将它们写为交换来从内存中清除脏(已修改)页面,而没有交换,它无法清除脏页面。

当您的物理内存不足时,每个进程都将不得不从磁盘加载其代码页,因为它驱逐了先前的进程代码页。结果将是猛烈的颠簸和交换子系统所做的过多工作。

这是一个非常重要的原则的特例:对于设计良好的系统,您不能通过减少选择来使其运行得更好。Linux是精心设计的系统。删除交换只会给它更少的选择,因此它表现得更糟也就不足为奇了。


1
仅当您分配的所有内存不足时,这才是正确的。失控的进程通常将尝试分配更多的内存,因此它将被尽早杀死,释放该内存,而不是继续尝试将系统交换为死亡以尝试容纳更多的分配,因此,禁用交换在以下情况下会有所帮助您只会从失控的过程中最大限度地利用公羊。
psusi 2011年

1
几乎所有内存都将几乎总是被分配。Linux是通过这种方式专门调整的。做一个cat /proc/meminfo负载的几个小时后,在任何典型的Linux机器。
大卫·史瓦兹

2
@syockit如果禁用分页,则无法运行任何程序。分页是一种在映射到内存时读取文件的机制。
David Schwartz

2
@psusi:交换时,干净页面不会减少到最少。相反,它将换出最近未使用过的脏的匿名页面。当然,无论哪种方式,如果工作集超出物理内存,您最终都会遭受剧烈的抖动。关键是,无论是否进行交换,在实际用尽内存之前,您都会遭受很多剧烈的颠簸。区别在于,使用交换时,猛烈的颠簸将交换(脏页,写入和读取)。如果不进行交换,则剧烈的抖动将是代码错误(干净的页面,只读)。
David Schwartz

2
@psusi:如果您所关心的是一个失控的进程,它会迅速消耗内存,那么您是正确的。但这不是OP所要讨论的,它是一个消耗过多但不是无限制或大量过量的内存的过程。当它通过较大的最佳点(挤压缓存)时,随着系统崩溃,它将越来越慢。
David Schwartz

13

一个比关闭交换更好的解决方案,即为内存不足的进程设置每个进程的数据段限制,这比关闭交换最多会导致随机进程在内存不足时被杀死。这样,失控的浏览器将达到极限并死亡,而不是导致整个系统变得不可用。例子,从外壳

(ulimit -d 400000; firefox) &

-d之后的数字以千字节为单位。您应该在系统上对此进行试验,以便为您的浏览习惯选择最佳价值。括号会导致创建一个子外壳。ulimit命令仅影响该外壳及其子级,从而将其效果与父外壳隔离。


比方说,这对于铬是有用的chromium吗?在铬中,我们有一堆使用少量内存的过程?
jberryman 2015年

@jberryman不,内存限制是按进程而不是按用户的。
凯尔·琼斯

当达到内存限制时,是否可以发送指定信号(例如SIGHUP)?
Geremia

1
@Geremia号。brk和sbrk系统调用停止工作,这将使大多数事物卷曲并死亡。
凯尔·琼斯

如果要进行手动调整,建议使用内存cgroup而不是ulimit,因为使用内存cgroup可以为整个进程组设置限制,并且可以将内存分配进程配置为停止,并且用户模式策略进程可以决定要执行的操作。做(例如发送一些信号,选择要杀死的进程,即时提高内存限制)。有关详细信息,请参见kernel.org/doc/Documentation/cgroup-v1/memory.txtkernel.org/doc/Documentation/cgroup-v2.txt
Mikko Rantalainen

4

为了确保不使用交换,最好避免在启动时添加任何交换。根据系统的不同,可以通过禁用swap引导服务或仅注释掉中的交换条目来完成此操作/etc/fstab

就您的挂断而言,其中的stop()功能/etc/init.d/swap可能会提供线索:

stop()
{
       ebegin "Deactivating swap devices"

       # Try to unmount all tmpfs filesystems not in use, else a deadlock may
       # occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
       cd "$RC_SVCDIR"
       umount -a -t tmpfs 2>/dev/null

       case "$RC_UNAME" in
               NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
               *)              swapoff -a >/dev/null;;
       esac
       eend 0
}

注意有关死锁的部分。您可以关闭交换之前尝试umount -a -t tmpfs自己做。


编辑:

可能您也可以通过修改sysctl设置来实现您的目标(请参阅此问题)。


我没有swapinit.d,也没有得到它fstab,但我有/etc/init.d/mountoverflowtmp这架tmpfs紧急日志写入。交换守护程序也使用tmpfs吗?
syockit

您可能在其他地方启用了它- grep -RF swap /etc/如果您想找到它,可以这样做。但是要禁用服务,您可以使用类似service(IIRC;我自己不使用Debian)的命令。
rozcietrzewiacz

1
交换本身不使用 tmpfs,因为它tmpfs是内存(RAM)文件系统。但是使用的其他服务/程序tmpfs可能以特殊方式依赖于交换。我真的不知道,但是这可能与缓存或tmpfs驱动程序声称可以访问交换空间的特殊方式有关。
rozcietrzewiacz

关于Linux如何处理虚拟内存,我有些不了解。我已通过多种可能的方式禁用了swap:via swapoff和via vm.swappiness=0。然而,kswapd0仍然运行!我想知道这是否是2.4天的回归?
syockit 2011年

5
@syockit这是预期的行为。系统仍在交换干净的页面(包含文件数据副本的页面)。它不需要交换空间即可交换干净的页面,因为可以从交换之外的其他来源读取干净的页面。
David Schwartz

2

注释掉交换分区项/etc/fstabswapoff -a在每次引导后运行要好。

我的硬件上存在kswapd0相同的问题。

调整vm.swappiness系统参数对我没有帮助。

sysctl -w vm.swappiness=0

我在Google上搜索并阅读了很多帖子,邮件列表,现在我认为这是内核错误。

如果没有活动的交换分区,并且可用内存变得少于某个阈值(在我的情况下约为300MB),则由于kswapd0疯狂而导致系统无响应。

可能是在特殊配置和条件下复制的。

对于某些人来说,可以通过重新安装系统并通过kswapd0禁用自定义内核来为其他人重新分区来解决。


2
如果kswapd0发疯并且您没有激活交换功能,则说明内存不足。您可以选择OOM Killer或OOM Killer kswapd0。Linux kswapd0之所以会如此,是因为内核认为慢速完成比中止进程更为重要。对于随意的人来说,内核认为仍然有足够的向前进步的门槛已经非常缓慢,几乎每个人都愿意选择OOM Killer。
米科·兰塔莱宁

1

在我的系统上(debian sid 2016-11-15),我这样做:

  1. 立即禁用交换:

    swapoff -a
    
  2. 在/ etc / fstab中用swap分区注释该行

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. 在systemd中禁用swap的安装:

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

那就足够了。/etc/initramfs-tools/conf.d/resume文件中有交换的参考。我不知道这是什么目的。也许此文件在下次重新启动时会出现问题(我还没有尝试重新启动,我的正常运行时间很宝贵;)。


1

计算机在后台因I / O吞吐量过大而挂起。iotop揭示kswapd0是罪魁祸首

我已经找到了避免这种情况的一种方法(到目前为止)。如果你想测试一下,看看它是如何做你的系统上,看到内核补丁里面这个问题。基本上,它Active(file)在内存压力下不会(至少)退出页面,因此磁盘抖动(恒定读取)几乎没有,并且允许OOM-killer在1秒内触发,而不是冻结OS似乎是什么例如永久性(或至少持续几分钟)。我希望真正的程序员(不是我的程序员)可以改进补丁并将其变成一个实际的解决方案,因为他们现在看到这样做的效果对于这些情况是可行的。


这个内核补丁已经上线了吗?
humanityANDpeace

@humanityANDpeace可能不是,因为它不是那么好(因为我不是程序员),但是我确实遇到了一些问题,例如:有时,根据工作量,使用补丁,在某些情况下可能会耗尽内存在这种情况下,如果没有此补丁,您将无法拥有,因此OOM-killer会杀死Xorg和xfwm4,除非我echo 1 | sudo tee /proc/sys/vm/drop_cachesActive(file):/ proc / meminfo的内存超过2GB(在16G RAM系统上)运行时-它可以达到最大4G
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.