【2016-05-19】一次tomcat頻繁掛掉的問題定位

問題:html

最近手中一個web項目頻繁掛掉,tomcat進程跑着跑着就沒了,catalina.out裏也沒有任何相關報錯。java

項目功能:web

該服務有3臺物理機,接收client端的rpc調用,本機起hive進程作查詢,將hive日誌及結果寫到一個nfs上,查詢結束後將結果寫到hdfs上,並將nfs上的臨時結果文件刪除。tomcat

分析:多線程

一、以前該項目常常OOM,後來加大了堆內存(運維同窗很任性的幫忙從4G直接改到了20G),再以後沒有報過OOM。運維

二、原本猜測這次也是內存的緣由,因而分析了CAT監控信息,剩餘內存充足,dump了tomcat的heap以後分析了內存、GC狀況,也沒有內存泄露的狀況,因而開始迷茫。ssh

三、因爲沒有tomcat掛掉時間點的現場,很差進一步分析。因而各類搜,搜到了開啓core dump能夠在tomcat異常退出的時候dump內存,因而開啓。Linux Core Dump學習

四、時間轉到下個週一,遇到了CAT和rpc服務都報一臺機器上tomcat掛掉了,可是ssh過去看到tomcat進程還在,是個定位問題的好機會,因而jstack了線程信息,發現不少線程block在了hive結果寫nfs上面。優化

這個服務同時在nfs上讀寫上百個文件,每一個hive進程有2個輸出線程一直在等待寫結果,同時還要讀寫hive的日誌,以前在操做nfs上的文件的時候就很是卡,可能瓶頸就在這裏。spa

五、因而修改邏輯,把hive進程的結果文件寫在本地,上線後感受再操做nfs的時候就流暢不少了,到如今3天了,也沒再掛過,以前是工做日天天2臺的節奏。

六、順手作了些其餘優化,如以前線程池是默認的命名方式,pool-N-thread-M,調試起來很不方便,參考ExecutorService的十個使用技巧Supercharged jstack: How to Debug Your Servers at 100mph,爲線程池添加跟功能有關的名字,調整了線程池的大小,jstack每分鐘一次(其實CAT中的心跳是有線程信息的,以前沒發現),優化結果後續觀察中。

總結:

工做以來第一次作這樣的問題定位,發現了不少能夠學習的點,也更清楚有不少不足哇~

相關文章
相關標籤/搜索