安排服务器资源,以便ssh始终可用

我有一个我的Web应用程序的Linux服务器。 每过一段时间,一个进程(一个长时间运行的脚本)可能会失控,消耗太多的内存/ CPU周期,并阻止所有其他进程。

在这种情况下,我不能SSH入服务器,我需要通过pipe理面板重新启动服务器。 我宁愿login到机器,只处理有问题的过程。

是否有可能在Linux机器上安排资源,但是,一个进程正在消耗资源,总是有足够的资源可用于ssh连接?

您可以使用“nice”来确定某些软件的优先级。

你也可以看看安装monit,如果达到某个阈值,你可以指示重启某个软件包。

沿这些行的监视configuration将自动重启Apache:

check process apache with pidfile "/usr/local/apache/logs/httpd.pid" start program = "/etc/init.d/httpd start" with timeout 60 seconds stop program = "/etc/init.d/httpd stop" if 2 restarts within 3 cycles then timeout if totalmem > 100 Mb then alert if children > 255 for 5 cycles then stop if cpu usage > 95% for 3 cycles then restart if failed port 80 protocol http then restart group server depends on httpd.conf, httpd.bin 

以简单的方式 – 不。 您可以使用nice来将SSH设置为最高优先级,但是如果没有足够的内存来处理新的连接,ssh将不起作用(不要忘记,成功login后服务器必须启动shell)。 你可以使用OOM杀手自动杀死过多的内存消耗,但如果你有成千上万的进程(像疯狂的Apache分叉),每个消耗一点点RAM(消耗1000×4MB RAM = 4GB内存没有OOM限制)。

硬重启是最简单和最快的解决scheme。 如果您需要某些服务全天候运行,则需要在HA安装中使用两台机器。 您可以使用zabbix或其他监视工具进行警告,并有时间在整个服务器崩溃之前解决它。

一个简单的解决scheme是将你的sshd进程重新渲染到-20。 如果它不能分叉(即进程太多或内存太less),这可能仍会使其无响应,如果需要从交换中重新加载,则速度会很慢,但这会显着降低可能性。 这也有一个副作用:每个sshlogin都有一个优先级为-20的优先级,如果你不小心的话,每个从ssh shell启动的进程将具有如此高的优先级。 你可能会也可能不希望发生这种情况。

还有一种方法可以正确禁用某个进程的交换,但是您需要修补sshd以调用mlockallmadvise ,但是您可能不想这样做。 有关详细信息,请参阅https://stackoverflow.com/questions/578137/can-i-tell-linux-not-to-swap-out-a-particular-processes-memory

您可以使用内存cgroups来确保Apache及其创build的进程不会使内存系统的其余部分无法运行。 系统可能变得没有响应,因为Apache消耗了足够的内存,系统开始交换。

你可以用cgcreate,cgset,cgclassify和cgexec工具设置crogups。