Ano*_*non 74 command-line swap freeze ram
当我在后台编译软件时,它经常发生在我身上,突然一切都开始变慢并最终冻结 [如果我什么都不做],因为我的 RAM 和交换空间都用完了。
这个问题假设我有足够的时间和资源来打开 Gnome 终端,搜索我的历史记录并执行一个sudo命令。
什么命令可以让我免于硬重启,或者根本不需要重启?
Oli*_*Oli 84
根据我的经验,Firefox 和 Chrome 使用的 RAM 比我前 7 台计算机的总和还要多。可能不止这些,但我正在偏离我的观点。您应该做的第一件事是关闭浏览器。命令?
killall -9 firefox google-chrome google-chrome-stable chromium-browser
Run Code Online (Sandbox Code Playgroud)
我已经将最流行的浏览器绑定到一个命令中,但很明显,如果您正在运行其他东西(或者知道您没有使用其中之一),只需修改该命令即可。这killall -9 ...是重要的一点。人们确实对SIGKILL(信号编号 9)持怀疑态度,但浏览器具有极强的弹性。更重要的是,通过缓慢终止SIGTERM将意味着浏览器会进行大量垃圾清理工作——这需要额外的 RAM 突发——而在这种情况下,这是你无法承受的。
如果您无法将其放入已运行的终端或Alt+F2对话中,请考虑切换到 TTY。Control+ Alt+F2会让你进入 TTY2,它应该允许你登录(虽然它可能很慢),甚至应该让你使用类似的东西htop来调试问题。我认为我从来没有用完 RAM 到无法起床的地步htop。
长期解决方案包括购买更多 RAM,通过远程计算机租用它,或者不做您当前正在做的事情。我将把复杂的经济论据留给你,但一般来说,RAM 的购买价格便宜,但如果你只需要一个突发量,按分钟或小时计费的 VPS 服务器是一个不错的选择。
Muz*_*zer 66
在启用了 Magic System Request Key 的系统上,按Alt + System Request+ f(如果没有在键盘上标记,System Request通常是在Print Screen键上)将手动调用内核的内存不足杀手 (oomkiller),它会尝试选择最严重的违规进程内存使用并杀死它。如果您的时间可能比您描述的要少,并且系统即将开始(或者可能已经开始)颠簸,您可以执行此操作 - 在这种情况下,您可能并不关心究竟是什么被杀死,只是您结束了建立一个可用的系统。有时这最终会杀死 X,但如今大多数情况下,它在选择一个坏进程方面比过去要好得多。
Sco*_*der 20
与其他答案相反,我建议您在执行此操作时禁用交换。虽然交换使您的系统以可预测的方式运行,并且通常用于增加访问磁盘的应用程序的吞吐量(通过驱逐未使用的页面为磁盘缓存留出空间),但在这种情况下,听起来您的系统正在变慢到无法使用的级别,因为过多的主动使用的内存被强行逐出以进行交换。
我建议在执行此任务时完全禁用交换,以便内存不足的杀手会在 RAM 填满时立即采取行动。
替代解决方案:
zswap在内核中启用。这会在页面被发送到交换之前压缩页面,这可能会提供足够的摆动空间来加速您的机器。另一方面,它最终可能会成为额外压缩/解压的障碍。tcc)编译您的项目,代价是编译产品的运行时性能会受到轻微影响。(如果您出于开发/调试目的这样做,这通常是可以接受的。)Goh*_*ohu 14
您可以使用以下命令(如果需要可重复)使用系统上最多的 RAM 终止进程:
ps -eo pid --no-headers --sort=-%mem | head -1 | xargs kill -9
Run Code Online (Sandbox Code Playgroud)
和:
ps -eo pid --no-headers --sort=-%mem: 显示所有正在运行的进程的进程 id,按内存使用情况排序head -1: 只保留第一行(使用最多内存的进程)xargs kill -9: 终止进程在德米特里的准确评论后编辑:
这是一个快速而肮脏的解决方案,应该在没有运行敏感任务(您不想要的任务kill -9)时执行。
Bas*_*tch 11
在运行消耗资源的命令之前,您还可以使用setrlimit(2)系统调用,可能使用ulimitbash shell的limit内置(或zsh 中的内置),特别是-vfor 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) ...)。
小智 11
当我在后台编译软件时,这种情况经常发生在我身上
在这种情况下,类似于“killall -9 make”(或者你用来管理你的编译的任何东西,如果不是 make)。这将停止编译继续进行,将 SIGHUP 从它启动的所有编译器进程(希望也使它们停止)并且作为奖励,假设您以登录的用户身份进行编译,则不需要 sudo在作为。而且由于它会杀死问题的实际原因,而不是您的 Web 浏览器、X 会话或随机某个进程,因此它不会干扰您当时在系统上执行的任何其他操作。
小智 9
为自己创造更多的交换。
以下将添加 8G 的交换:
dd if=/dev/zero of=/root/moreswap bs=1M count=8192
mkswap /root/moreswap
swapon /root/moreswap
Run Code Online (Sandbox Code Playgroud)
它仍然会很慢(您正在交换),但您实际上不应该用完。现代版本的 Linux 可以交换文件。现在交换分区的唯一用途是让您的笔记本电脑休眠。
在短时间内获得大量空闲 RAM 的一种方法是使用zram,它创建一个压缩的 RAM 磁盘并在那里交换。对于任何半体面的 CPU,这比常规交换要快得多,并且对于许多现代 RAM 猪(如 Web 浏览器),压缩率非常高。
假设你已经安装并配置了 zram,你所要做的就是运行
sudo service zramswap start
Run Code Online (Sandbox Code Playgroud)