我正在使用 Passenger + Apache 运行 Ruby on Rails 应用程序。还有一个使用 mod_perl 运行的 perl 邮件列表服务器 (Sympa)。
我有服务器(一台 Ubuntu 机器)的 root 和 sh 访问权限。
大多数时候它运行良好;服务器有足够的内存和磁盘空间来处理工作负载。
但时不时地(大概每 3 个月一次)一些 Apache 进程似乎会“失控”,开始疯狂消耗内存和 CPU。结果,网站瘫痪了(有时我不得不进行冷重启;仅仅重启 Apache 是不够的)。我做了一些测试,似乎挂起的进程是 Ruby 进程,这让我怀疑 Passenger 行为不当。
以下是上次“中断” (刚刚发生) 的一些 Munin 图表
我对 ruby 进程 (Passenguer) 持怀疑态度。但是,我无法确定触发“野生进程”的条件(我只是托管应用程序,我没有开发它)。虽然这很好,但直接“杀死挂起的进程”可能更简单。
我想知道是否有办法“自动终止”占用过多内存或 CPU 的进程。是否有任何 Apache 模块或配置标志可以解决这个问题?
编辑:到目前为止,我尝试了 Apache 的 RLimitCPU、RLimitMEM 和 RLimitNPROC,但都无济于事 - 看来 Passenger 不受这些设置的影响。我非常确定问题现在出在 Passenger 上,所以我正在重新标记并重写这个问题的部分内容。
答案1
ulimits(通过 /etc/security/limits.conf 配置,或者仅在执行可能有问题的二进制文件之前运行 ulimit)可能是解决此问题的方法。