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

我认为这个问题有点类似于这个post。

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

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

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

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

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

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

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

更新:它没有挂起一段时间,但现在我又有几次出现了。 我现在一直在我的屏幕上保持ram监视器,当挂起时它仍然显示〜30%可用(可能由磁盘缓存使用)。 其他症状:如果我正在观看video(VLC播放器),声音会先停止,几秒钟后图像会停止。 当声音停止时,我仍然可以对PC进行一些控制,但是当图像停止时,我甚至无法移动鼠标,所以在等待一段时间后重新启动它。 顺便说一下,当我开始观看video但是在某个时间(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 

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

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

 sysctl -w vm.swappiness=5 

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

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

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

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

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


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

 vm.swappiness=5 vm.min_free_kbytes=65536 

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

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

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

解决方案是检查交换分区的当前UUID

 sudo blkid 

然后sudo nano /etc/fstab用blkid报告的那个替换错误的swap的UUID值。

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

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

我终于找到了一个解决方案,通过安装zram而不是在SSD上使用物理交换。 要安装它我只是按照这里的说明,像这样:

 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设置为一个非常低的值,这会导致内核交换得太晚,从而使系统的内存太低而无法使用。

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

 sysctl vm.swappiness 

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

 sudo sysctl vm.swappiness=10 

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

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

没有什么对我有用!!

所以我写了一个脚本来监控内存使用情况。 如果内存消耗增加阈值,它将首先尝试清除RAM缓存。 您可以在脚本上配置此阈值。 如果内存消耗即使在那时也没有低于阈值,它将按照内存消耗的递减顺序开始执行一个进程,直到内存消耗低于阈值。 我默认将其设置为96%。 您可以通过更改脚本中变量RAM_USAGE_THRESHOLD的值来配置它。

我同意消耗高内存的杀戮过程并不是完美的解决方案,但最好杀死一个应用程序而不是丢失所有的工作! 如果RAM使用率增加阈值,脚本将向您发送桌面通知。 如果它杀死任何进程,它也会通知您。

 #!/usr/bin/env python import psutil, time import tkinter as tk from subprocess import Popen, PIPE import tkinter from tkinter import messagebox root = tkinter.Tk() root.withdraw() RAM_USAGE_THRESHOLD = 96 MAX_NUM_PROCESS_KILL = 100 def main(): if psutil.virtual_memory().percent >= RAM_USAGE_THRESHOLD: # Clear RAM cache mem_warn = "Memory usage critical: {}%\nClearing RAM Cache".\ format(psutil.virtual_memory().percent) print(mem_warn) Popen("notify-send \"{}\"".format(mem_warn), shell=True) print("Clearing RAM Cache") print(Popen('echo 1 > /proc/sys/vm/drop_caches', stdout=PIPE, stderr=PIPE, shell=True).communicate()) post_cache_mssg = "Memory usage after clearing RAM cache: {}%".format( psutil.virtual_memory().percent) Popen("notify-send \"{}\"".format(post_cache_mssg), shell=True) print(post_cache_mssg) if psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD: print("Clearing RAM cache saved the day") return # Kill top C{MAX_NUM_PROCESS_KILL} highest memory consuming processes. ps_killed_notify = "" for i, ps in enumerate(sorted(psutil.process_iter(), key=lambda x: x.memory_percent(), reverse=True)): # Do not kill root if ps.pid == 1: continue elif (i > MAX_NUM_PROCESS_KILL) or \ (psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD): messagebox.showwarning('Killed proccess - save_hang', ps_killed_notify) Popen("notify-send \"{}\"".format(ps_killed_notify), shell=True) return else: try: ps_killed_mssg = "Killed {} {} ({}) which was consuming {" \ "} % memory (memory usage={})". \ format(i, ps.name(), ps.pid, ps.memory_percent(), psutil.virtual_memory().percent) ps.kill() time.sleep(1) ps_killed_mssg += "Current memory usage={}".\ format(psutil.virtual_memory().percent) print(ps_killed_mssg) ps_killed_notify += ps_killed_mssg + "\n" except Exception as err: print("Error while killing {}: {}".format(ps.pid, err)) else: print("Memory usage = " + str(psutil.virtual_memory().percent)) root.update() if __name__ == "__main__": while True: try: main() except Exception as err: print(err) time.sleep(1) 

将代码保存在文件中,例如save_hang.py。 运行脚本为:

 sudo python save_hang.py 

请注意,此脚本仅与Python 3兼容,并且需要您安装tkinter软件包。 你可以安装它:

 sudo apt-get install python3-tk 

希望这可以帮助...

我经常从现场的Ubuntu SD卡上运行我的一台笔记本电脑,在硬盘上有一个小的ext4存储分区和一个交换文件。 当使用几乎所有的RAM并且swappiness值太低时(有时候我更喜欢在可能的情况下完全关闭硬盘驱动器,因为它很吵),Linux的性能往往会让我失望,这样才能达到杀死Firefox的TTY1需要15分钟。

/proc/sys/vm/vfs_cache_pressure从默认值100提升到值6000似乎有助于防止这种情况发生。 但是,内核文档警告不要这样做,说

 Increasing vfs_cache_pressure significantly beyond 100 may have negative performance impact. Reclaim code needs to take various locks to find freeable directory and inode objects. With vfs_cache_pressure=1000, it will look for ten times more freeable objects than there are. 

我不完全确定这样做的副作用,所以我要小心这样做。

我很长一段时间一直在努力解决这个问题,但现在它似乎在我的笔记本电脑上得到了解决。

如果其他答案都不适合你(我尝试了大部分),请使用min_free_kbytes ,以便在计算机开始交换时在RAM中有更多空间(就在你的空闲RAM上达到这个最小值之前)。

我有16GB内存,但更早的内存已经满了,然后停止响应10到30分钟,直到有些东西被交换。

至少对我来说,将min_free_kbytes值设置为高于建议值会使交换过程相当快。

对于16GB RAM,试试这个:

 vm.min_free_kbytes=500000 

要设置此值,请参阅其他答案,或只是谷歌:)

我面临同样的问题,从Ubuntu 16.04到Ubuntu 18.10在一段时间后使用firefox多个标签时,它会被卡住,之后就无法做任何事情。 然后我想按电源按钮再次继续。 我担心我的系统会受损!