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

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

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

在这种情况下,我无法通过 ssh 进入服务器,需要通过管理面板重新启动服务器。我更愿意登录机器并只处理有问题的进程。

是否可以这样安排 Linux 机器中的资源,使得无论进程如何消耗资源,总有足够的资源可用于 ssh 连接?

答案1

您可以使用“nice”来优先考虑某些软件。

您还可以研究安装 monit,如果达到某个阈值,您可以指示它重新启动某个包。

按照以下方式进行 monit 配置将自动重新启动 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

答案2

简单来说 - 不行。你可以将niceSSH 设置为最高优先级,但如果没有足够的内存来处理新连接,ssh 将无法工作(不要忘记成功登录后服务器必须启动 shell)。你可以使用 OOM killer 自动杀死消耗过多 RAM 的进程,但如果你拥有数千个进程(如疯狂的 apache 分叉)并且每个进程都消耗少量 RAM(1000 x 4MB RAM = 4GB RAM 消耗,没有 OOM 限制),那么它就不起作用了。

硬重启是最简单、最快捷的解决方案。如果您需要某些服务全天候运行,则需要在 HA 设置中使用两台机器。您可以使用 zabbix 或其他监控工具发出警告,并有时间在整个服务器崩溃之前解决问题。

答案3

您可以使用内存控制组确保 Apache 及其创建的进程不会耗尽系统其余部分的内存。系统可能会变得无响应,因为 Apache 消耗了太多内存,导致系统开始交换。

你可以使用以下方式设置 crogupscgcreate、cgset、cgclassify 和 cgexec工具。

答案4

一个简单的解决方案是将 sshd 进程的优先级重新调整为 -20。如果它无法分叉(即进程太多或内存太少),这仍可能使其无响应,如果需要从交换中重新加载,它会很慢,但这会大大降低可能性。这也有副作用,即每个 ssh 登录都将具有 -20 优先级,并且 - 如果您不小心 - 从 ssh shell 启动的每个进程都将具有如此高的优先级。您可能希望或不希望发生这种情况。

还有一种方法可以积极地禁用进程的交换,但您需要修补 sshd 才能调用mlockallmadvise,但您可能不想这样做。请参阅https://stackoverflow.com/questions/578137/can-i-tell-linux-not-to-swap-out-a-particular-processes-memory了解详情。

相关内容