代码中引用了libhdfs,在Hadoop集群负载过高或者某个datanode掉线死极易导致进程挂起,从堆栈可以看出是挂在了pthread_cond_timedwait上面而且是在libjvm.so附近,在https://svn.apache.org/repos/asf/hadoop/common/branches/HDFS-326/CHANGES.txt中有提到修复了一个deadlock的bug。
在目前这种过渡阶段也没有想到很好的办法去验证并修复这个问题,下面是我采取的一个简单方法,在程序中定时去touch一个文件,另外一个监控脚本去stat该文件的修改时间,如果时间超过一定范围即认为死锁了,kill -9然后拉起。但是在某些时候进程负载较高时会导致定时器没有被触发,这时监控脚本就会产生误杀现象。为了解决这个误杀,我又自作聪明的开了一个线程专门去定时touch文件,没过多久死锁现象又出现了,但是进程却没被kill,跟一个同事讨论后才意识到自己犯了一个很荒唐的错误,这里的死锁只是线程级别的!!!
后来另一同事共享了他的方案,通过pstack查看线程堆栈,如果一段时间内堆栈没有发生改变,那么进程基本上是死锁了,感觉这个方法也不错,但是程序中如果有多个线程也不太凑效。