我正在使用Debian,使用ext4格式化的硬盘驱动器,运行在linux 3.1上。
我记得以前的linux版本(可能在3.0之前),如果内存耗尽,并且没有启用交换,程序通常会崩溃。这是完美的我的环境:简单的网页浏览,没有关键的操作。也就是说,如果我无意中遇到一个坏网站,它消耗了太多的内存,它只是崩溃,而不是使我的终端无法使用。
但是在我当前的设置中,计算机会在后台挂起大量的I/O吞吐量。iotop发现kswapd0是罪魁祸首,这意味着它是交换的结果。在使用swapon -s确定已启用的任何掉期之后,我再次使用swapoff -a禁用所有掉期,并再次使用swapon -s确认所有掉期都已禁用。
然后我又试着最大限度地利用我的记忆。唉,我料到的行为并没有发生。相反,kswapd0一遍又一遍地尝试交换内存,但由于没有交换空间而失败了。因为它从来没有放弃,我的电脑被锁在永久的I/O严重冻结,不利于我的磁盘的健康。
我是不是做错了尝试swapoff -a的事情?为什么这种行为与过去不同(可能在3.0之前)?
发布于 2011-11-15 16:57:15
禁用交换不能做你想做的事。您仍然会获得剧烈的I/O吞吐量,但是它将是干净的页面,而不是脏的页面。
如果没有交换,系统将将干净(未经修改的)页面的缓存压缩到接近零,因为这是唯一可以从物理内存中删除的页面。它只能通过将脏页(修改后的)页写入交换来将它们从内存中删除,没有交换,它就无法删除脏页。
由于物理内存不足,每个进程将不得不从磁盘加载其代码页,因为它将驱逐前一个进程代码页。其结果将是交换子系统所做的猛烈打击和过度工作。
这是一个非常重要的原则的特例:对于一个设计良好的系统来说,你不能通过减少它的选择来使它运行得更好。Linux是一个设计良好的系统.删除交换只会给它提供更少的选择,所以它的行为更糟糕也就不足为奇了。
发布于 2012-02-01 19:05:57
一个更好的解决方案比关闭交换(在内存不足时最多会导致随机进程被杀死)更好的解决方案是为从网络中取出内容的进程设置每个进程数据段的限制。这样,一个失控的浏览器就会达到极限并死亡,而不是导致整个系统无法使用。示例,从shell中
(ulimit -d 400000; firefox) &-d后面的数字以千字节为单位。你应该在你的系统上试验这一点,为你的浏览习惯选择最佳的价值。圆括号导致创建一个子shell;ulimit命令只影响该shell及其子程序,将其效果与父shell隔离开来。
发布于 2013-04-24 04:47:34
在每次引导之后,最好在/etc/fstab中注释掉交换分区条目,而不是运行swapoff -a。
我在硬件上的kswapd0也有同样的问题。
调优vm.swappiness系统参数对我没有帮助。
sysctl -w vm.swappiness=0我搜索并阅读了大量的帖子、邮件列表,现在我认为这是内核错误。
当没有活动交换分区时,空闲内存变得小于某个阈值(在我的例子中大约是300 my ),由于kswapd0的疯狂,系统会变得没有响应。
可能是用特殊的结构和条件复制出来的。
对于某些人来说,这是通过重新安装系统来解决的,为其他人重新分区,通过构建禁用kswapd0的定制内核来解决。
https://unix.stackexchange.com/questions/24625
复制相似问题