当我在后台编译软件时,这种情况经常发生在我身上,突然间一切都开始变慢,最终冻结[如果我什么也不做],因为我的RAM和交换空间都用完了。
这个问题假设我有足够的时间和资源来打开Gnome Terminal,搜索我的历史记录并执行一个sudo
命令。
什么命令可以使我免于必须进行硬重启或完全重启的麻烦?
make
,-j4
例如一次尝试4个并行构建。
当我在后台编译软件时,这种情况经常发生在我身上,突然间一切都开始变慢,最终冻结[如果我什么也不做],因为我的RAM和交换空间都用完了。
这个问题假设我有足够的时间和资源来打开Gnome Terminal,搜索我的历史记录并执行一个sudo
命令。
什么命令可以使我免于必须进行硬重启或完全重启的麻烦?
make
,-j4
例如一次尝试4个并行构建。
Answers:
以我的经验,Firefox和Chrome使用的内存比前7台计算机的总和还多。可能还不止这些,但我已经远离了我的观点。您应该做的第一件事就是关闭浏览器。命令吗
killall -9 firefox google-chrome google-chrome-stable chromium-browser
我已经将最流行的浏览器绑定到一个命令中,但是很显然,如果您正在运行其他浏览器(或者知道您未使用其中一种),只需修改该命令即可。该killall -9 ...
是重要的一点。人们确实对此感到疑惑SIGKILL
(信号号9),但浏览器却非常灵活。更重要的是,缓慢终止SIGTERM
会意味着浏览器会产生大量的清理垃圾,这需要大量额外的RAM,而在这种情况下,这是您无法承受的。
如果您无法进入已经运行的终端或Alt+ F2对话框,请考虑切换到TTY。Control+ Alt+ F2将带您进入TTY2,它应该允许您登录(尽管可能很慢),甚至应该允许您使用类似的方法htop
来调试问题。我认为我还没有用完RAM,直到无法站htop
起来。
长期解决方案包括购买更多的RAM,通过远程计算机租用它,或者不做您当前正在做的事情。我将保留复杂的经济论据,但总的来说,RAM便宜,但是如果您只需要突发量,则按分钟或小时计费的VPS服务器是一个不错的选择。
lazygit
不时使用的与自己的命令关联的几个命令,也许可以在此处应用类似的内容?整个killall ...
脚本可以简化为一个简单的内容emptyram
或类似形式
emptyram
脚本,而不仅仅是打入killall -9 firefox
。
在启用了“魔术系统请求键”的系统上,按Alt + System Request+ f(如果未在键盘上标记,System Request通常会在Print Screen键上)将手动调用内核的内存不足杀手(oomkiller),该程序将尝试选择最坏的违规进程。占用内存并杀死它。如果您的时间可能比描述的要少,并且系统即将启动(或可能已经启动)抖动,则可以执行此操作-在这种情况下,您可能并不在乎到底是什么被杀死,而只是终止用一个可用的系统。有时这可能最终导致杀死X,但是如今,大多数时候选择一个错误的过程比过去要好得多。
kernel.sysrq
为1
或包含正确位的数字时,此功能才起作用/etc/sysctl.d/10-magic-sysrq.conf
。
与其他答案相反,我建议您在执行此操作时禁用交换。尽管交换可以使您的系统以可预测的方式运行,并且经常用于提高访问磁盘的应用程序的吞吐量(通过逐出未使用的页面以为磁盘高速缓存留出空间),但在这种情况下,听起来好像您的系统正在减慢速度到无法使用的程度,因为强行驱逐了太多频繁使用的内存以进行交换。
我建议在执行此任务时完全禁用交换功能,以便内存不足杀手在RAM填满后立即采取行动。
替代解决方案:
zswap
在内核中启用。这会在页面发送到交换之前对其进行压缩,这可能会提供足够的摆动空间以加快计算机的速度。另一方面,它可能最终会受到额外压缩/解压缩的阻碍。tcc
)来编译项目,但会给编译后的产品带来轻微的运行时性能损失。(如果您出于开发/调试目的这样做通常是可以接受的。)sudo swapoff -a
当您已经处于绑定状态时,运行可能会节省您的时间:它将立即停止对交换空间的任何其他使用,即,应在下一个瞬间调用OOM杀手,并使计算机进入工作状态。sudo swapoff -a
在调试内存泄漏或编译(例如firefox)时,也是一种极好的预防措施。通常,交换有点有用(例如,用于休眠或交换出真正不需要的东西),但是当您实际使用内存时,冻结会更糟。
您可以使用以下命令(必要时重复进行此操作)以使用系统上最多的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
:杀死进程在Dmitry的准确评论后进行编辑:
这是一个快速而肮脏的解决方案,当没有敏感任务(不想执行的任务)在运行时,应执行该解决方案kill -9
。
在运行资源消耗命令之前,您还可以使用setrlimit(2)系统调用,可能使用ulimit
bash shell的limit
内置程序(或zsh 的内置程序),尤其是-v
for RLIMIT_AS
。然后过大的虚拟地址空间的消耗(例如用MMAP(2)或SBRK(2)由所使用的malloc(3) )将失败(用错误号(3)是ENOMEM
)。
然后,它们(即在键入后,shell中的饥饿进程ulimit
)将在冻结系统之前终止。
另请阅读Linux Ate My RAM并考虑禁用内存过量使用(通过echo 0 > /proc/sys/vm/overcommit_memory
以root用户身份运行命令,请参见proc(5) ...)。
当我在后台编译软件时,这种情况经常发生在我身上
在这种情况下,类似“ killall -9 make”的东西(或用于管理编译的任何东西,如果不是make的话)。这将使编译进一步停止,将SIGHUP从其启动的所有编译器进程(希望也导致它们停止),此外,假设您以与登录的用户相同的身份进行编译,则不需要sudo。在作为。而且,由于它可以杀死问题的实际原因,而不是杀死您的Web浏览器,X会话或随机的某些进程,因此它不会干扰您当时在系统上所做的任何事情。
为自己创建更多交换。
以下将添加8G交换:
dd if=/dev/zero of=/root/moreswap bs=1M count=8192
mkswap /root/moreswap
swapon /root/moreswap
它仍然很慢(正在交换),但实际上不应该用完。现代版本的Linux可以交换到文件。目前,交换分区的唯一用途是使笔记本电脑处于休眠状态。
fallocate -l 8G /root/moreswap
代替dd
,以避免以往任何时候都需要做的我8GB / O在系统颠簸。但是,这不适用于任何其他文件系统。绝对不是XFS,其中swapon将未写入的扩展视为漏洞。(我想这个xfs邮件列表讨论没有成功)。另请参阅swapd
,一个守护进程可以动态创建/删除交换文件以节省磁盘空间。也请参见askubuntu.com/questions/905668/…–
xul.dll
)约为50 MB,因此比Linux内核大10倍。
在短时间内获得大量可用RAM的一种方法是使用zram,它创建一个压缩RAM磁盘并在此处交换。对于任何半个体面的CPU,这都比常规交换快得多,并且对于许多现代RAM容器(如Web浏览器),其压缩率非常高。
假设您已经安装并配置了zram,那么您所要做的就是运行
sudo service zramswap start
可以做的另一件事是通过以下命令释放内存页面缓存:
echo 3 | sudo tee /proc/sys/vm/drop_caches
来自kernel.org文档(添加了重点):
drop_caches
写入此内容将导致内核丢弃干净的缓存以及可回收的平板对象(如牙科和inode)。 一旦删除,他们的记忆就变得自由了。
要释放页面缓存:echo 1> / proc / sys / vm / drop_caches要释放可回收的平板对象(包括牙科和索引节点):echo 2> / proc / sys / vm / drop_caches要释放平板对象和页面缓存:echo 3> / proc / sys / vm / drop_caches
这是一种非破坏性操作,不会释放任何脏物。为了增加通过该操作释放的对象数量,用户可以在写入/ proc / sys / vm / drop_caches之前运行“ sync”。这将最大程度地减少系统上脏对象的数量,并创建更多要删除的候选对象。
/proc/sys/vm/swappiness
。将swappiness设置为0,就对了。默认设置为60,您将关闭。但是,将其设置为200时,将首先删除正在运行的进程中使用最少的页面,在这种情况下,此命令可能很有用。但是,将swappiness设置为0(或较低的值,可能是20或30)将是更好的通用方法。
kswapd
错误的旧内核中很有用(有些人甚至使用它创建了cronjobs)。但是你是对的,我怀疑这将有助于解决这个问题。