当我在后台编译软件时,经常会发生这种情况:突然一切开始变慢,最终甚至会卡住[如果我什么都不做],因为我已经用完了RAM和交换空间。
这个问题假设我有足够的时间和资源来打开Gnome终端,搜索我的历史记录,并执行一个sudo
命令。
有什么命令可以让我避免进行硬重启,或者根本不需要重启吗?
当我在后台编译软件时,经常会发生这种情况:突然一切开始变慢,最终甚至会卡住[如果我什么都不做],因为我已经用完了RAM和交换空间。
这个问题假设我有足够的时间和资源来打开Gnome终端,搜索我的历史记录,并执行一个sudo
命令。
有什么命令可以让我避免进行硬重启,或者根本不需要重启吗?
killall -9 firefox google-chrome google-chrome-stable chromium-browser
killall -9 ...
。人们对SIGKILL
(信号编号9)有些犹豫,但浏览器非常强大。此外,通过SIGTERM
慢慢终止会导致浏览器进行大量的清理工作,这需要额外的内存,而在这种情况下你无法承受这样的开销。htop
这样的工具来调试问题。我从来没有遇到过内存耗尽到无法打开htop
的情况。lazygit
命令相关联的命令,我偶尔使用它们,也许这里可以应用类似的东西?整个killall ...
脚本可以简化为一个简单的emptyram
或类似的东西。 - Francisco Presencia在启用了魔术系统请求键的系统上,按下 Alt + 系统请求 + f(如果你的键盘上没有标记,系统请求 通常位于 Print Screen 键上)将手动调用内核的内存杀手(oomkiller),它会尝试选择最糟糕的内存使用进程并将其终止。如果你可能没有描述的时间,并且系统即将开始(或者可能已经开始)频繁交换内存,你可以这样做-在这种情况下,你可能不关心具体终止哪个进程,只想要一个可用的系统。有时候这可能会终止 X,但现在大多数情况下,它在选择一个糟糕的进程方面比以前好得多。
kernel.sysrq
设置为 1
或包含正确位数的数字时,这才起作用。请在 /etc/sysctl.d/10-magic-sysrq.conf
文件中进行设置。 - Ruslanbash
、[
、man
等),或者是指GUI(X服务器,可能是openbox
,还是其他类似LXDE的东西),或者是指应用软件(从apt
或其他包管理器获取的软件)?其中一些比其他一些更复杂。 - wizzwizz4sudo swapoff -a
可能会拯救你:它会立即停止对交换空间的任何额外使用,即OOM killer应该在下一瞬间被调用并使机器恢复正常。当调试内存泄漏或编译例如firefox时,sudo swapoff -a
也是一个很好的预防措施。通常情况下,交换空间有一定用处(例如休眠或交换出真正不需要的东西),但当你实际使用内存时,冻结问题会更严重。 - Jonas Schäferswapoff
会拒绝工作,或者在系统试图换入任何可用的页面(并驱逐由文件支持的只读页面)时触发更多的抖动,当一个失控的进程驱逐其他所有人的页面时。我没有想到它会在下一次需要更多页面时触发OOM killer。 - Peter Cordesps -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
命令终止的任务)时执行。
ulimit
内置(或zsh中的limit
内置)一起使用,特别是使用-v
来设置RLIMIT_AS
。然后,太大的虚拟地址空间消耗(例如使用malloc(3)使用的mmap(2)或sbrk(2))将失败(并且errno(3)将为ENOMEM
)。ulimit
后挨饿的进程)会在冻结您的系统之前被终止。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版本可以将数据交换到文件中。如今,交换分区的唯一用途就是让笔记本电脑进入休眠状态。
fallocate -l 8G /root/moreswap
而不是dd
来避免在系统繁忙时进行8GB的I/O操作。然而,这种方法在其他文件系统中并不适用,尤其是XFS文件系统,因为swapon命令会将未写入的范围视为空洞。(我猜测这个xfs邮件列表讨论没有取得成果)。另请参考swapd
,这是一个守护进程,可以动态创建/删除交换文件以节省磁盘空间。还可以查看https://askubuntu.com/questions/905668/does-ubuntu-support-dynamic-swap-file-sizing - Peter Cordesxul.dll
)大约有50MB,所以它比Linux内核重大约10倍。 - Dmitry Grigoryevsudo service zramswap start
echo 3 | sudo tee /proc/sys/vm/drop_caches
/proc/sys/vm/swappiness
中的设置。如果将swappiness设置为0,你是对的。默认设置为60时,你接近正确。然而,如果将其设置为200,那么最近未使用的运行进程页面将首先被丢弃... 在这种特殊情况下,这个命令可能会有用。但是,将swappiness设置为0(或一些较低的值,比如20或30)可能是一个更好的通用方法。 - Juleskswapd
bug时(有些人甚至创建了定时任务来使用它)。但你说得对,我怀疑它对这个问题没有帮助。 - Dmitry Grigoryevsudo swapoff -a
会禁用交换空间,当系统内存不足时,内核会自动杀掉得分最高的进程。如果我知道将要运行一些占用大量内存的任务,我会使用这个命令来终止它,而不是让它进入交换空间并永远卡住。之后可以使用sudo swapon -a
重新启用交换空间。
稍后,您可能想查看一下交换设置。听起来您的交换空间与根分区位于同一磁盘上,这会在使用交换空间时减慢系统速度,所以如果可以的话应该避免这种情况。此外,在我看来,现代系统通常配置了过多的交换空间。32GiB的RAM通常意味着默认分配了32GiB的交换空间,好像您真的想把32GiB放入交换空间一样。
make
命令时,可以尝试使用-j4
参数,同时进行4个并行构建。 - Shahbaz