问题描述
我认为这个问题有点类似于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
文件。
如果您的磁盘速度很慢,请考虑购买新磁盘。