记一次tomcat版本问题导致CPU超过100%

生产现象

java服务启动5分钟左右,top命令查看发现CPU飙升到300%,居高不下

解决步骤

  • 根据以前的经验,先找高消耗的进程号,再找高消耗的线程号,查看线程信息找问题。
    参考线上服务CPU100%问题快速定位实战
  • 根据线程号找到jstack里面的信息如下:
"https-jsse-nio-9000-ClientPoller-1" #85 daemon prio=5 os_prio=0 tid=0x00007f3a3d657000 nid=0x1a23 runnable [0x00007f3a14ed9000]
   java.lang.Thread.State: RUNNABLE
    at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
    at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
    at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
    at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
    - locked <0x000000008740ef68> (a sun.nio.ch.Util$2)
    - locked <0x000000008740ef58> (a java.util.Collections$UnmodifiableSet)
    - locked <0x000000008740edb0> (a sun.nio.ch.EPollSelectorImpl)
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
    at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:791)
    at java.lang.Thread.run(Thread.java:745)

"https-jsse-nio-9000-ClientPoller-0" #84 daemon prio=5 os_prio=0 tid=0x00007f3a3d655800 nid=0x1a22 runnable [0x00007f3a14fda000]
   java.lang.Thread.State: RUNNABLE
    at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
    at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
    at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
    at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
    - locked <0x000000008740f5d8> (a sun.nio.ch.Util$2)
    - locked <0x000000008740f5c8> (a java.util.Collections$UnmodifiableSet)
    - locked <0x000000008740f420> (a sun.nio.ch.EPollSelectorImpl)
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
    at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:791)
    at java.lang.Thread.run(Thread.java:745)

发现两个线程都是tomcat的NIO问题,可以肯定不是我们的业务代码引起的,但不是特别敢怀疑是tomcat的bug。根据以往的经验,首先怀疑是locked里面的东西互锁了,但是查看这些locked的id并没有找到其他线程有一样的id。

  • 正当没有头绪的时候,发现整个jstack里面只有这两个线程是属于"ClientPoller"类型的,从此入手,在网上找到一篇阿里中间件团队的一篇文章:断网故障时Mtop触发tomcat高并发场景下的BUG排查和修复,跟我们线上环境比较像,开始怀疑是tomcat版本问题。但是文章中的tomcat版本是7.0.54,阿里已经跟apache反馈该bug,按理说在7版本应该已经修复了,而我们的tomcat版本是8.5.4版本,难道这个问题到8.5.4版本还没修复?

后来百度实在找不到答案,google来解决。找到如下文章,正好确认是8.5.4版本问题
High CPU load with the JSSE client poller on Tomcat 8.5

  • 最后,我们升级到8.5.11版本之后,问题得到了解决。

总结

遇到问题要敢于怀疑,即使是大神写的代码,在中间某些版本修复了某些问题,不见得不会在后面版本迭代更新之后再次出现。

你可能感兴趣的:(记一次tomcat版本问题导致CPU超过100%)