如何诊断具有空闲应用程序的 Web 服务器为何变得无响应?

How to diagnose why a web server with idle applications becomes unresponsive?

我有一个 Digital Ocean droplet(512MB RAM,20GB SSD 磁盘,Ubuntu 13.10 x64)

  1. 一个MongoDB实例和
  2. 一个Tomcat 7台服务器

运行.

在 Tomcat 服务器上,安装了以下应用程序

  1. 基于 Apache CXF 的应用程序,它接受处理 Web 服务请求,与数据库交互并执行计划的作业,
  2. Vaadin 应用程序,
  3. JSF (Primefaces) 应用程序和
  4. Psi Probe.

当我

  1. 重启Tomcat,
  2. 使用 Vaadin and/or JSF 应用程序,
  3. 然后几个星期在那台机器上什么都不做(那段时间它基本上是闲置的),
  4. 然后尝试打开 JSF and/or Vaadin 应用程序,

我发现网站没有响应(在浏览器中输入 URL 后没有任何显示)。

当我重新启动 Tomcat (sudo service tomcat7 restart) 时,一切又恢复正常了。我在 Tomcat 日志中没有看到任何明显的问题。

我怎样才能知道,

  1. 问题是出在 Tomcat 端(其中一个应用程序即使处于空闲状态也会消耗太多资源)还是出在 OS 端(机器上没有任何反应,因此 OS 将自己置于 "hibernating" 模式)和
  2. 如果问题出在 Tomcat,究竟是哪个应用程序导致的?

请从上到下开始。

then try to open the JSF and/or Vaadin application,

I find the site unresponsive (nothing is displayed after I enter the URL in the browser).

  1. 重启前检查服务是否还在运行sudo service tomcat7 statusand/orps -ef | grep tomcat
  2. 检查 netstat -patune | grep <portnumber, e.g. 443> 服务器是否正在侦听配置的端口
  3. 如果请求到达服务器,请检查您的 httpd/Apache/Tomcat 访问日志,如果是,请检查是否存在与请求相关的错误或超时
  4. 检查数据库连接是否仍然可用
  5. 要强制生成一些错误日志,请尝试更改 Tomcat 连接池配置的 maxIdle、maxActive 和 maxWait 属性。 maxWait 默认值为 -1,有时在这几周内创建的连接将永远等待。

@Patrick 提供了一些出色的基本测试。

我注意到您只有 512 MB 的 RAM。使用一些相当强大的软件,例如 tomcat,再加上 MongoDB,您的机器可能会超载。

基于此,我会提出一些额外的检查事项:

sudo 免费

应该会告诉您正在使用多少内存,以及您使用了多少交换 space。

sudo 顶部

会告诉您哪个进程使用的内存最多。您可能希望按内存对 top 的输出进行排序(默认通常按 CPU 利用率)。

最重要的是,检查 /var/log 中的日志文件(尤其是 /var/log/messages)。您可能会发现内核终止了您的进程之一的迹象(可能 tomcat)。