我遇到了一个奇怪的问题。每次我停止 Tomcat,SSH 就会变得非常慢,几乎完全没有响应。SSH 需要一分钟甚至更长时间才能接受任何命令。当我最终再次启动 Tomcat 时,一切都恢复正常。
这发生在一个非常繁忙的服务器上。问题是我需要经常因为应用程序升级而停止 Tomcat。通常升级需要几秒钟,但这里却需要将近 10 分钟,因此我们经历了不必要的停机。
我发现当我停止 Tomcat 时,top
很多ksoftirqd/X
进程的 CPU 占用率达到 100%。这可能是问题所在吗?
内核版本是:2.6.18-308.11.1.el5
Red Hat 版本是:Red Hat Enterprise Linux Server release 5.9 (Tikanga)
知道为什么会发生这种情况吗?
答案1
我知道这不是“最佳实践”,但是,我建议您通过 ssh 远程重置 tomcat 并将输出设置为 null:
ssh your_server '/etc/init.d/tomcat restart > /dev/null 2>&1'
(您可以用重新启动 tomcat 时使用的等效命令替换上述命令)。
这是一种解决方法,而不是解决方案。您可以在连接到其他 ssh 会话时尝试此操作,并检查问题是否仍然存在并影响所有会话?
答案2
ssh 连接缓慢/ssh 延迟是高负载的症状。高负载通常是由 io 阻塞引起的,而 io 阻塞通常是由交换引起的。
要检查负载,请运行uptime
,否则top
当 ssh 没有响应时,您可能会看到负载数字超过 10。在正常使用期间,它们可能会徘徊在 2 以下。
运行free
或top
查看您的内存使用情况,您可能会看到很多交换。
找到根本原因后,您就可以搜索“tomcat 在关机时进行交换”或“tomcat 高负载”的原因,这可能是因为它试图将存储在缓存或交换中的某些内容写入磁盘。您的 tomcat jvm 最大堆大小是否大于您拥有的内存量?
也许当您的 web 应用程序发生故障时,连接到它的某些东西会不断重试,从而造成 DoS 场景。
这可能都特定于您的 Web 应用程序,因此请使用通用术语。