我有一个Spring
应用程序,最近已从测试环境转移到生产环境。大多数情况下CPU使用率为%2-3。但有时(每天1或2次)突然达到%400(有4个cpus),然后我的应用程序崩溃。当问题发生时,我无法观察到任何异常情况(例如额外的流量)。
有关我的应用的一些信息是,
ScheduledTask
中有Service
个。他们制作了一些HttpUrlConnection
s。-d64 -Xms6g -Xmx10g -XX:MaxPermSize=512m
sysstat
进行日志记录。我正在观看cpu和ram的使用,不仅适用于整个系统,也适用于我的应用程序。我还要注意,ram的使用率最高可达60%
An example from CPU logs
GC日志和线程转储:
我记录了GC,还有2分钟间隔的线程转储(jstack)。在崩溃和崩溃时,正常时间没有显示差异。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
我找不到问题的原因。有什么建议吗?任何形式的帮助都表示赞赏。
答案 0 :(得分:3)
正如宝贵的评论所指出的,这个问题不是来自垃圾收集。原因是完全不同的。我花了大约一个星期来搞清楚,所以我写这篇文章以防其他人遇到同样的问题。
首先,我没有在问题中添加(因为我认为不重要),我使用JHipster,最近切换到Undertow
作为应用程序服务器。
在深入研究细节之后,我观察到消耗CPU的线程是XNIO
个线程。我在一些网站上看到,使用由XNIO
提供支持的应用服务器的一些人也遇到了同样的问题。自从Undertow
使用XNIO
后,我从Undertow
更改为Tomcat
,问题就解决了。