乐趣区

关于java:记一次线上服务请求阻塞问题排查

问题

有个我的项目有一个服务节点出了问题,收到的申请始终没有返回,看日志是有收到申请,然而在接管到申请之后,没有下一步的解决(日志)了。

内存

因为该我的项目早前呈现过一次内存溢出的状况,所以第一步先看下内存状况,只应用了 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 看到 %util100%,阐明产生的 I / O 申请太多,I/ O 零碎曾经满负荷,该磁盘可能存在瓶颈。
那是不是 log 日志打印的太多了,进入服务器查看服务日志,发现服务开启了 DEBUG 日志,大量的 DEBUG 日志,且很多日志单行特地大,失常状况下线上是不应该关上 DEBUG 日志的

解决形式

线上敞开 DEBUG 日志,后续继续察看是否还会复现。

退出移动版