所以我的系统被 DOS 了,或者我刚刚打开了一个相当大文件 (openstreetmaps planet.osm)。系统完全没有响应……响应如此之慢,以至于需要大约 10 分钟才能进入我的 shell、运行 top 并终止有问题的进程。我准备按下重置按钮。
问题:是否可以留出一定数量的最低系统资源,这样,如果我的系统被限制,我仍然可以留出 2% 的 CPU(2ghz 系统 ~ 40 mhz!- 应该足够用于 shell 了吧?我的意思是,它在 90 年代初期有效)?或者有某种方式来限制有问题的进程?
我遇到过这种情况,我希望操作系统能够限制失控进程,这样我仍然可以继续使用系统,即使这意味着整体性能会下降 10%。在这种情况下,能够采取行动而不是完全无助,这真是太好了。
答案1
你说“好”真有趣。一个解决方案是“重新调整”有问题的进程,这样它就不会占用 CPU(本质上是降低应用程序的优先级)。
要启动优先级较低的进程:
nice <program> &
要更改正在运行的进程的优先级:
renice 4 <program>
优先级的范围从 -20 到 20。0 是默认值,20 是最低优先级,-20 是最高优先级。
答案2
您可以编写一个脚本来查找在 tty0 或 ttyS0 或任何需要 root 优先级登录的地方运行的进程,并将这些进程设置为实时调度优先级。脚本本身应该以实时优先级启动。
在交换风暴期间访问内存是一项更困难的任务。您可以使用 Linux cgroups。您可以用 C 语言编写程序而不是脚本,并使用 mlockall 将其内存锁定到 RAM 中。然后该程序可以使用 ptrace 探测其他进程并强制它们调用 mlockall。您可以使用它来获取不受交换影响的 bash shell。
除非您是程序员或者可以找到已经编写过此代码的人(我没有),否则 cgroups 可能是保留一些高优先级内存的更简单方法。