最近碰到的三个Case

上周接连在处理三个Case,处理的有点焦头烂额,比较郁闷,先给大家分享下,如果有碰过类似case或有解决方案的同学,欢迎回复下。

Case I
第一个Case是一个跑在Tomcat的应用,现象就是应用没响应,负载也很低,jstack出来的信息显示tomcat的http-apr-*-exec的线程都处于同样的状态:
java.lang.Thread.State: RUNNABLE
org.apache.tomcat.jni.Socket.recvbb
对Tomcat APR不怎么熟,于是纯粹是借助google来排查这个问题,翻了好几页,发现多数都是碰到这个现象,但没有解决的描述,只好去翻代码了,从相应的代码来看,觉得这个地方不太可能一直被卡住才对,并且这里还是有超时的,dump内存分析了下当时的超时参数,发现也是有的,陷入更加不知道解决的境地了。

还好第二天有另外一个在排查这个问题的同事做了一个尝试,把apr模式换成了bio模式(熟悉tomcat的人会知道tomcat connector主要有bio/nio/apr三种模式,但貌似没找到很详细的介绍tomcat实现这几种模式的文章,如果有人知道,欢迎回复下),然后可以看到这些线程都卡在了
java.net.SocketInputStream.socketRead0,对bio熟多了,所以可以知道是因为建了较多的连接,都卡在了读事件上了,那其实解决方法就可以是把线程数开大点。

为什么应用会突然出现连接增多的现象,是因为前面增加了一堆的机器,但我挺难理解的是apr模式为什么会出现线程数由于连接数增加就耗满的现象,理论上如果是nio类型的模式的话,增加的一点连接数其实是不会有什么太大的压力的(因为通常是用很少的线程数来处于连接和读写事件的),看起来我觉得tomcat在这块的实现比netty貌似差了不少,不过对这块不算非常熟悉,还不能完全判断。

ps: 另外一个同时之前还碰到过前面在等tomcat返回,而tomcat又在等前面发数据的死锁bug,但具体信息已经不太记得了。

Case II
一个依赖JMagick的应用,在新的一个环境部署后出现Could not initialize class magick.ImageInfo的现象,但没有其他更多的信息,排查的时候主要是检查JMagick对应的jar、native的相关的包是否存在,折腾了N次,而且也确认jar、native以及依赖的native包都存在,但还是没解决…

后来这个问题突然就好了,而且更奇怪的是,lsof去查的时候发现native包还是没装载,但其他的机器是装载了的,神奇…

这个Case如果你有什么排查的建议的话,欢迎回复…

Case III
一个应用出现OOM,dump下来的内存分析后显示有个巨大的char[]数组,而这个char[]里面的信息是非常长的堆栈信息等,而且看起来还没什么关联,非常奇怪,触发这个char[]的异常的地方看起来比较容易理解,就是有代码在线程里执行this.wait的时候竟然没调用synchronized(this),这个错误有点低级了,所以问题算是能解决。

但我一直没想明白的就是这个巨大的char[]是从哪生成出来的,还好的是AliJDK里默认就打开了当生成巨大的array的时候打印相应的堆栈(非Ali JDK没这功能),但诡异的是从堆栈来看,这个信息抛出的地方非常随机,貌似唯一的共同点就是在打错误日志,这个现在还没太多的头绪,后面如果有进展再写篇东西吧。

=============================
欢迎关注微信公众号:hellojavacases

关于此微信号:
分享Java问题排查的Case、Java业界的动态和新技术、Java的一些小知识点Test,以及和大家一起讨论一些Java问题或场景,这里只有Java细节的分享,没有大道理、大架构和大框架。

公众号上发布的消息都存放在http://hellojava.info上。

《最近碰到的三个Case》有3个想法

    1. 第二个jmagick的问题是否可以ldconfig -v|grep jmagick看一下动态链接库是否正确加载,突然就好了是否可能和有的执行用户的环境变量中设置了ld_library_path有关。

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*