是的,这是一个很宽泛的问题,但我认为这是一个相当合理的问题。有时程序和脚本运行时间太长或占用太多内存,真的开始拖慢我的系统。很好。有时系统速度太慢,我几乎无法将鼠标滑到终端并发送垃圾邮件Ctrl+ C。我很困惑,为什么操作系统不提供调度优先级来允许用户使用鼠标、键盘并终止程序。见过这种情况吗?
> ./program
^C^C^C^C^C^C^C^C^C^C^C^Z^Z^Z^C^C^C^C^C^Clsdhafjkasdf
现在,Ctrl+C并不像其他一些那么严厉(它可以由应用程序处理甚至忽略,但这里情况并非如此)。Ctrl+Z也可以很好地完成工作,因为我可以kill -9 %1
立即完成,但它也不起作用。
另一种方法可能是跳转到虚拟控制台Ctrl+ Alt+ F2,登录并终止有问题的应用程序,但由于系统繁忙,这种方法不起作用,我得到的是黑屏。同样,我无法打开新终端(窗口弹出但无法将我放入 shell)。其他打开的终端可能没有响应或运行命令。
我怀疑系统无法运行的一个原因是有问题的程序正在访问交换并将更多核心应用程序从主内存中推出。即使是最简单的命令(给我一个 bash 提示符或执行 kill)也无法在边缘处产生循环。我没有这方面的证据,因为top
当它发生时我无法运行。Ctrl有没有什么方法可以提高原始+工作的机会C?。也许是增加 X 和终端优先级,或者自动终止使用大量内存或开始过多交换的程序?
当这种情况发生时,我可以使用其他 linux-fu 来重新获得控制权吗(例如SysRq命令)?
更新:经过更多测试后,我确信是应用程序占用了太多内存并触发了交换。即使在关闭有问题的应用程序后,其他应用程序也需要很长时间才能开始响应,就好像它们已被挤出主内存一样。我真的很想找到一种方法来自动将高内存使用率的程序限制在主内存中。如果它交换,它无论如何都会太慢,所以让它继续下去有什么意义呢。
注意:我并不是想为某个特定应用程序寻找解决方案,也不知道某些操作何时会占用内存。我想解决这种系统范围的减速问题。也就是说,许多程序都会导致这种情况。据我所知,我没有弄乱系统配置,这是一个相当标准的 Fedora 安装。我对这些减速并不感到惊讶,但我确实想要更多的控制。
我希望我的窗口管理器保持运行,这些是我希望避免的最后手段。通常,只有当我的 GPU 陷入循环并阻止 X 时,我才需要这些。如果启用, Ctrl+ Alt+backspace是终止 X 和所有应用程序的便捷快捷方式,让您返回登录状态。 再次使用更有效的命令如果启用,是Alt+ SysRq+ K。如果这不起作用,那就是按住电源按钮的时间。
Alt+ SysRq+ F(感谢@Hastur),它可以杀死占用大量内存的进程,虽然破坏性很大,但作为最后的手段还是有用的。更新:不完全确定这里的所有后果,但@Xen2050 的建议似乎ulimit
可以解决很多问题...
TOTAL_PHYSICAL_MEMORY=$(grep MemTotal /proc/meminfo | awk '{print $2}')
ulimit -Sv $(( $TOTAL_PHYSICAL_MEMORY * 4 / 8))
将其留在我的 bashrc 中并观察情况如何。
更新:情况似乎总体上还不错,但我猜有些应用程序会共享大型库并映射大型文件。即使它们几乎不消耗任何实际内存,也不太可能频繁地访问交换区。似乎没有一个足够低的数字可以杀死致命的访问交换区的应用程序,而让常规应用程序(例如 4.6gb VIRT amarok
)继续运行。
有关的:https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-resources-memory-of-a-process-and-its-children/174894,但仍然存在限制开始大量访问交换的应用程序的问题。
这正是我所追求的解决方案:是否可以让 OOM 杀手更早地介入?
答案1
您的具体情况听起来不像是一个进程占用了所有可用的 CPU,更像是显示器或内存不足的问题。应该可以通过以下方法限制内存:cgroups或 ulimit / 用户限制。
但是如果你想尝试限制某些进程的 CPU 使用率,这可能会奏效:
如果你确切知道哪些进程占用了你的 CPU,你可以使用cpulimit
减慢速度。我经常在低优先级进程上使用它,有时会耗尽 CPU,效果很好。它:
向进程发送 SIGSTOP 和 SIGCONT 信号,以验证是否可以控制该进程并限制其平均消耗的 CPU 量。这可能会导致误导性(烦人的)作业控制消息,表明该作业已停止(实际上已停止,但立即重新启动)。这也可能导致检测或依赖 SIGSTOP/SIGCONT 的交互式 shell 出现问题。例如,您可能将作业放在前台,结果却看到它立即停止并在后台重新启动。(另请参阅http://bugs.debian.org/558763。
它的手册页中有运行它的示例,例如:
Assuming you have started `foo --bar` and you find out with top(1) or
ps(1) that this process uses all your CPU time you can either
# cpulimit -e foo -l 50
limits the CPU usage of the process by acting on the executable
program file (note: the argument "--bar" is omitted)
# cpulimit -p 1234 -l 50
limits the CPU usage of the process by acting on its PID, as
shown by ps(1)
# cpulimit -P /usr/bin/foo -l 50
same as -e but uses the absolute path name
答案2
您可以安装“xkill”应用程序并将“xkill”分配给某些键盘快捷键,例如 Ctrl+shift+k,每当任何脚本或程序滞后时,只需按 crtl+shift+k 并单击要终止的应用程序即可。就是这样