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


Ubuntu很快耗尽内存,而我的电脑开始冻结。什么命令会解决这个问题?

, , , ,

问题描述

当我在后台编译软件时,经常会发生这种情况,并且突然间一切开始变慢并最终冻结(如果我什么都不做),因为我已经用完了RAM和交换空间。

这个问题假设我有足够的时间和资源来打开Gnome终端,搜索我的历史记录,并执行一个sudo命令。

什么命令可以使我无需重新启动硬盘或进行任何重新启动?

最佳解决方案

根据我的经验,Firefox和Chrome使用的RAM比我的前7台计算机的总和还要多。可能比这更多,但我离开了我的观点。你应该做的第一件事就是关闭你的浏览器。一个命令?

killall -9 firefox google-chrome google-chrome-stable chromium-browser

我已经将最流行的浏览器集成到一个命令中,但显然如果你正在运行其他的东西(或者知道你没有使用其中的一种),只需修改命令即可。 killall -9 ...是重要的一点。人们确实对SIGKILL(信号编号9)有所了解,但浏览器极具弹性。更重要的是,通过SIGTERM缓慢终止将意味着浏览器会执行一系列清理垃圾 – 这需要一阵额外的RAM – 这在这种情况下是无法承受的。

如果您无法将其导入already-running终端或Alt + F2对话框,请考虑切换至TTY。 Control + Alt + F2会让你到TTY2,它应该允许你登录(虽然它可能很慢),甚至应该让你使用类似htop的东西来调试问题。我不认为我的内存已经耗尽,无法启动htop

长期的解决方案包括购买更多的RAM,通过远程计算机租用,或者不做你现在正在做的事情。我将把错综复杂的经济争论留给你,但一般来说,内存购买起来很便宜,但如果你只需要突发数量,那么每分钟或每小时计费的VPS服务器是不错的选择。

次佳解决方案

在启用了Magic System Request Key的系统上,按下Alt + System Request + f(如果键盘上没有标记,System Request通常位于Print Screen键上)将手动调用内核的内存不足杀手(oomkiller)最糟糕的内存使用过程并杀死它。如果你的时间可能比你描述的要少,而且系统即将开始(或者已经开始)抖动,那么你可以做到这一点 – 在这种情况下,你可能并不关心被杀死的东西,只是你结束了建立一个可用的系统。有时候这可能会导致X被杀,但现在大多数时候在选择一个不好的过程比以前要好很多。

第三种解决方案

与其他答案相反,我建议您在执行此操作时禁用交换。尽管swap可以让系统以可预测的方式运行,并且通常用于增加访问磁盘的应用程序的吞吐量(通过驱逐未使用的页面以腾出磁盘缓存空间),在这种情况下,您的系统听起来像是放缓了到无法使用的级别,因为太多积极使用的内存被强制驱逐掉。

我建议在执行此任务时完全禁用交换,以便out-of-memory杀手将在RAM填满后立即执行操作。

替代方案:

  • 将交换分区放入RAID1,提高交换的读取速度

    • 或者RAID0,如果你感觉有风险,但是如果你的任何一个磁盘发生故障,这将导致大量正在运行的程序。

  • 减少并发构建作业的数量(“更多的核心=更多的速度”,我们都说,忘记它在RAM上需要线性收费)

  • 这可能是双向的,但是尝试在内核中启用zswap。这会在页面发送到交换之前压缩页面,这可能会提供足够的摆动空间来加快您的机器运行速度。另一方面,它可能最终会成为阻碍其额外压缩/解压缩的障碍。

  • 关闭优化或使用其他编译器。优化代码有时可能占用几千兆字节的内存。如果你打开了LTO,你也会在链接阶段使用大量的RAM。如果一切都失败了,你可以尝试使用lighter-weight编译器(例如tcc)编译你的项目,代价是编译后产品的运行时性能略有下降。 (如果您为了开发/调试的目的而这样做,通常这是可以接受的。)

第四种方案

您可以使用以下命令(如果需要,重复使用)来使用系统上最多的RAM来终止进程:

ps -eo pid --no-headers --sort=-%mem | head -1 | xargs kill -9

附:

  • ps -eo pid --no-headers --sort=-%mem:显示所有正在运行的进程的进程ID,按内存使用情况排序

  • head -1:只保留第一行(使用最多内存的进程)

  • xargs kill -9:杀死进程


德米特里的准确评论后编辑:

这是一个快速且肮脏的解决方案,应在没有敏感任务运行时执行(您不需要kill -9的任务)。

第五种方案

this happens pretty often to me when I am compiling software in the background

在这种情况下,就像“killall -9 make”(或者任何你用来管理你的编译的东西,如果没有的话)。这将停止编译进一步进行,SIGHUP将SIGHUP从它启动的所有编译器进程(希望导致它们停止),作为奖励,不需要sudo,假设您编译为与您登录的用户相同的用户作为。而且,由于它会杀死问题的实际原因,而不是您的Web浏览器,X会话或一些随机过程,它不会干扰您当时在系统上执行的任何其他操作。

第六种方案

在运行资源消耗命令之前,还可以使用setrlimit(2)系统调用,可能与Bash shell的ulimit内建(或zsh中的limit内置),特别是-vRLIMIT_AS。那么太大的虚拟地址空间消耗(例如malloc(3)使用的mmap(2)sbrk(2))将会失败(errno(3)ENOMEM)。

然后,他们(即键入ulimit后shell中的饥饿进程)将在冻结系统之前终止。

另请阅读Linux Ate My RAM并考虑禁用memory overcommitment(通过以root身份运行命令echo 0 > /proc/sys/vm/overcommit_memory,请参阅proc(5) …)。

第七种方案

为自己创建更多的交换。

以下将添加8G的交换:

dd if=/dev/zero of=/root/moreswap bs=1M count=8192
mkswap /root/moreswap
swapon /root/moreswap

它仍然很慢(你正在交换),但你不应该真的用完。现代版本的Linux可以交换文件。现在关于交换分区的唯一用途是用于休眠笔记本电脑。

第八种方案

在短时间内获得大量可用RAM的一种方法是使用我如何使用zRam?,它创建一个压缩的RAM磁盘并在那里交换。使用任何half-decent CPU,这比普通交换快得多,并且压缩率非常高,许多现代RAM大量web浏览器。

假设你已经安装和配置了zram,你所要做的就是运行

sudo service zramswap start

第九种方案

另一个可以做的事情是通过这个命令释放内存页面缓存:

echo 3 | sudo tee /proc/sys/vm/drop_caches

kernel.org文档(重点添加):

drop_caches

Writing to this will cause the kernel to drop clean caches, as well as reclaimable slab objects like dentries and inodes. Once dropped, their memory becomes free.

To free pagecache: echo 1 > /proc/sys/vm/drop_caches To free reclaimable slab objects (includes dentries and inodes): echo 2 > /proc/sys/vm/drop_caches To free slab objects and pagecache: echo 3 > /proc/sys/vm/drop_caches

This is a non-destructive operation and will not free any dirty objects. To increase the number of objects freed by this operation, the user may run `sync’ prior to writing to /proc/sys/vm/drop_caches. This will minimize the number of dirty objects on the system and create more candidates to be dropped.

第十种方案

sudo swapoff -a将禁用交换,如果系统内存不足,内核将自动使用highest score中止进程。如果我知道我将运行一些RAM-heavy,如果它失控,我宁愿杀死它,而不是让它进入交换并永久卡住,我会使用它。之后使用sudo swapon -a到re-enable。

稍后,您可能需要查看交换设置。听起来你的交换与根分区在同一个磁盘上,当你点击交换时会降低你的系统速度,所以如果可以的话,就避免这种情况。另外,在我看来,现代系统通常会配置太多的交换。 32GiB RAM通常意味着默认分配32GiB交换,就好像您真的想将32GiB放入交换空间一样。

参考资料

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