当前位置: 首页>>技术教程>>正文


计算机冻结几乎完整的RAM,可能是磁盘缓存问题

, , , ,

问题描述

我认为这个问题有点类似于this线程。

如果我启用或禁用交换无关紧要,只要实际使用的RAM量开始接近最大值并且磁盘缓存几乎没有剩余空间,系统就会完全没有响应。

盘子疯狂地旋转,有时候经过很长时间等待10-30分钟它会解冻,有时候不会(或者我没有用完)。有时如果我快速行动,我可以设法慢慢打开控制台并杀死一些ram吃应用程序,如浏览器,系统几乎立即解冻。

由于这个问题,我几乎从来没有在交换中看到任何东西,只有在那里有一些MB,然后很快出现这个问题。我没那么受过教育的猜测是它以某种方式连接到磁盘缓存过于贪婪,或者内存管理过于宽松,所以当需要内存时,它不会足够快地释放并使系统匮乏。

如果使用加载在磁盘缓存中的延迟文件(500MB +)并且稍后系统无法足够快地卸载它们,则可以非常快速地解决问题。

任何帮助或想法将不胜感激。

现在我必须生活在持续的恐惧中,当做某事时计算机可以冻结而且我通常必须重新启动它,如果它真的用完ram我会更喜欢它只是杀死一些用户空间应用程序,如broser(最好是如果我能以某种方式标记哪个先杀死)

虽然这种错误是为什么在这种情况下不交换拯救我的原因。

更新:它没有挂起一段时间,但现在我又有几次出现了。我现在一直在我的屏幕上保持ram监视器,当挂起时它仍然显示〜30%可用(可能由磁盘缓存使用)。其他症状:如果我正在观看视频(VLC播放器),声音会先停止,几秒钟后图像会停止。当声音停止时,我仍然可以对PC进行一些控制,但是当图像停止时,我甚至无法移动鼠标,所以在等待一段时间后重新启动它。顺便说一下,当我开始观看视频但是在某个时间(20分钟)并且我当时没有主动做任何其他事情时,这并没有发生,即使浏览器和oowrite一直在第二个屏幕上打开。基本上某些东西只是决定在某一点发生并挂起系统。

根据评论中的请求,我在挂起后立即运行dmesg。我没有注意到任何奇怪的东西,但不知道该看什么,所以这里是:https://docs.google.com/document/d/1iQih0Ee2DwsGd3VuQZu0bPbg0JGjSOCRZhu0B05CMYs/edit?hl=en_US&authkey=CPzF7bcC

最佳解决办法

要解决此问题,我发现您需要将以下设置设置为总物理RAM的5%-6%左右,除以计算机中的核心数:

sysctl -w vm.min_free_kbytes=65536

请记住,这是一个per-core设置,所以如果我有2GB内存和两个内核,那么我只计算了1%的6%并增加了一点额外的安全性。

这会强制计算机尝试保留这一数量的RAM,这样做会限制缓存磁盘文件的能力。当然它仍然会尝试缓存它们并立即将它们交换掉,所以你应该限制你的交换:

sysctl -w vm.swappiness=5

(100 =尽可能频繁地交换,0 =仅根据总需要交换)

结果是linux不再随机决定在观看时加载一个大约1GB的整个电影文件,并在这样做时杀死机器。

现在有足够的预留空间来避免 memory 匮乏,这一直是问题所在(因为之前没有像以前那样冻结)。

经过一天的测试 – 锁定已经消失,有时会出现轻微的减速,因为内容会被更频繁地缓存,但如果我不必每隔几个小时重新启动计算机,我就可以忍受。

这里的教训是 – 默认内存管理只是一个用例,并不总是最好的,即使有些人试图暗示 – 家庭娱乐ubuntu应该配置不同于服务器。


您可能希望通过将这些设置添加到/etc/sysctl.conf来使这些设置永久化,如下所示:

vm.swappiness=5
vm.min_free_kbytes=65536

次佳解决办法

在Ubuntu 14.04的新安装中发生了这种情况。

就我而言,它与提到的sysctl问题无关。

相反,问题是交换分区的UUID在安装过程中与安装后不同。所以我的交换从未启用,我的机器会在使用几个小时后锁定。

solution用于检查交换分区的当前UUID

sudo blkid

然后用sudo nano /etc/fstab替换错误交换的UUID值和blkid报告的值。

一个简单的重启来影响变化,瞧。

第三种解决办法

我知道这个问题很老,但我在Acer C720 Chromebook的Ubuntu(Chrubuntu)14.04中遇到了这个问题。我试过KrišjānisNesenbergs解决方案,它有点工作,但有时仍然崩溃。

我终于找到了一个解决方案,通过安装zram而不是在SSD上使用物理交换。要安装它,我只需按照说明here,如下所示:

sudo apt-get install zram-config

之后我通过在第21行修改/etc/init/zram-config.conf来配置zram交换的大小。

20: # Calculate the memory to user for zram (1/2 of ram)
21: mem=$(((totalmem / 2 / ${NRDEVICES}) * 1024))

我用1代替2,以使zram大小与我拥有的ram数量相同。由于这样做,我没有更多的冻结或系统无响应。

第四种办法

我的猜测是你已经将vm.swappiness设置为一个非常低的值,这会导致内核交换太晚,从而使系统的RAM太低而无法使用。

您可以通过执行以下操作来显示当前的swappiness设置:

sysctl vm.swappiness

默认情况下,此值设置为60. Ubuntu Wiki建议将其设置为10,但可以随意将其设置为更高的值。您可以通过运行来更改它:

sudo sysctl vm.swappiness=10

这将仅为当前会话更改它,为了使其持久,您需要将vm.swappiness = 10添加到/etc/sysctl.conf文件。

如果您的磁盘速度很慢,请考虑购买新磁盘。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1610.html,未经允许,请勿转载。