Spring应用程序占用所有CPU然后崩溃

时间:2017-10-09 13:57:43

标签: java spring garbage-collection

我有一个Spring应用程序,最近已从测试环境转移到生产环境。大多数情况下CPU使用率为%2-3。但有时(每天1或2次)突然达到%400(有4个cpus),然后我的应用程序崩溃。当问题发生时,我无法观察到任何异常情况(例如额外的流量)。

有关我的应用的一些信息是,

  • 它有一些由Android客户端调用的REST端点。
  • 其中一个ScheduledTask中有Service个。他们制作了一些HttpUrlConnection s。
  • 我的流量不是很大,例如每分钟300-400个请求并且它基本上是稳定的,即在网络呼叫中没有观察到峰值。
  • 此流量的CPU使用率达到最大值%3,但问题发生的时间除外。以下是过去24小时CPU利用率的可视化: enter image description here
  • 我的服务器有4个核心CPU,12 GB RAM和300GB全SSD磁盘。 Linux版本4.4.0-93-generic(buildd @ lgw01-03)(gcc版本5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1~16.04.4))
  • 内存设置:-d64 -Xms6g -Xmx10g -XX:MaxPermSize=512m
  • 我使用sysstat进行日志记录。我正在观看cpu和ram的使用,不仅适用于整个系统,也适用于我的应用程序。我还要注意,ram的使用率最高可达60% An example from CPU logs GC日志和线程转储: 我记录了GC,还有2分钟间隔的线程转储(jstack)。在崩溃和崩溃时,正常时间没有显示差异。
  • 日志:20:30 - 06:26
  • 服务器崩溃时间:06:26
  • GC Analysis
  • Thread dumps     (Thread dump 1(05:40).. Thread dump 14(06:24))     (其他线程转储是在05:40之前)
  • GC分析评论:" 97.14%的时间是由于分配失败造成的。但它的时间是21:12:22,然后在撞车前9小时。"
  • 日志文件中的上一个错误
    • 2017-10-09 06:26:19.393 ERROR 5986 --- [ XNIO-2 task-1] t.o.m.w.rest.errors.ExceptionTranslator : An unexpected error occurred: I/O error while reading input message; nested exception is java.io.InterruptedIOException: XNIO000808: I/O operation was interrupted
    • 2017-10-09 06:26:19.396 ERROR 5986 --- [ XNIO-2 task-25] io.undertow.request : UT005022: Exception generating error page /error

我找不到问题的原因。有什么建议吗?任何形式的帮助都表示赞赏。

1 个答案:

答案 0 :(得分:3)

正如宝贵的评论所指出的,这个问题不是来自垃圾收集。原因是完全不同的。我花了大约一个星期来搞清楚,所以我写这篇文章以防其他人遇到同样的问题。

首先,我没有在问题中添加(因为我认为不重要),我使用JHipster,最近切换到Undertow作为应用程序服务器。

在深入研究细节之后,我观察到消耗CPU的线程是XNIO个线程。我在一些网站上看到,使用由XNIO提供支持的应用服务器的一些人也遇到了同样的问题。自从Undertow使用XNIO后,我从Undertow更改为Tomcat,问题就解决了。