共计 964 个字符,预计需要花费 3 分钟才能阅读完成。
问题
有个我的项目有一个服务节点出了问题,收到的申请始终没有返回,看日志是有收到申请,然而在接管到申请之后,没有下一步的解决(日志)了。
内存
因为该我的项目早前呈现过一次内存溢出的状况,所以第一步先看下内存状况,只应用了 20%,通过 jmap -heap 过程 ID
看到新生代和老年代都只有 70% 多,并且没有在快速增长。
CPU
通过 top
命令看到零碎 CPU 使用率是 27.3%,服务过程是 2.0%。
通过ps -mp 过程 ID -o THREAD,tid,time
,也没有看到服务里有哪个线程 CPU 特地高。
死锁查看
通过 jstack 过程 ID > jstack.log
导出线程列表,发现没有死锁,然而线程基本上都卡在日志打印上。
"http-nio-8080-exec-199" #727 daemon prio=5 os_prio=0 tid=0x00007f766809b000 nid=0x3c0 waiting for monitor entry [0x00007f75e90c8000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.logging.log4j.core.appender.OutputStreamManager.writeBytes(OutputStreamManager.java:359)
- waiting to lock <0x00000000814db020> (a org.apache.logging.log4j.core.appender.OutputStreamManager)
at org.apache.logging.log4j.core.layout.TextEncoderHelper.writeEncodedText(TextEncoderHelper.java:96)
I/O
既然线程都卡在日志打印上,那是不是 I / 0 问题?
通过 iostat -x 1 10
看到 %util
是100%
,阐明产生的 I / O 申请太多,I/ O 零碎曾经满负荷,该磁盘可能存在瓶颈。
那是不是 log 日志打印的太多了,进入服务器查看服务日志,发现服务开启了 DEBUG 日志,大量的 DEBUG
日志,且很多日志单行特地大,失常状况下线上是不应该关上 DEBUG 日志的。
解决形式
线上敞开 DEBUG 日志,后续继续察看是否还会复现。
正文完