log4j 1.x版本 導致tomcat假死問題記錄

故障描述:線上項目,每隔一段時間就會假死一次,現象是網站無法打開,重啓後解決,但是不定時會出現,沒有固定的規律

原因分析:1第一時間查了cpu和內存情況,並沒有發現特殊情況,只是cpu比往常稍高了一些,也不會導致服務不可用

因爲要急於給用戶使用,前面兩次便直接重啓了。

                  2、分析日誌,發現日誌是到了某個點突然就截止不動了,沒有報內存溢出,線程異常,也沒有jvm crash的日誌,證明服務確實在啓用,只是無法對外提供服務,並且無法自動恢復(排除內存或線程會釋放的問題),因爲是用的k8s部署的,本身k8s環境對開發不太透明,所以一直懷疑有可能是環境問題,讓運維加了探針,檢測到服務接口不可用便自動重啓,後面發現確實會有檢測到接口不可用情況,逐漸排除了運維環境問題

                  3、後面嘗試增加pod(增加應用數),有1個服務提到2個,再到4個,還是會出現這種情況,某個pod有問題,但其他pod沒問題,初步排除了mysql等中間件負載問題(不排除連接池不釋放等)

                  4、不定時假死,前面沒拿到jvm日誌,懷疑tomcat線程數或者連接池或者內存已滿,就增加了線程數和重新配置了jvm參數(-Xms,-Xmx),前面好了點,後面還是會出現

                  5、後面再次遇到,用ps -T -p <PID>|wc -l 查看了tomcat線程數,發現有兩百多,tomcat的線程配置的200個被佔滿了,其他的是守護等進程,用jstack命令查看,發現很多都是BLOCK狀態

然後發現Category裏面有同步代碼,這裏是日誌打印的

public void callAppenders(LoggingEvent event) {
    int writes = 0;
 
    for(Category c = this; c != null; c=c.parent) {
      // Protected against simultaneous call to addAppender, removeAppender,...
      synchronized(c) {
	if(c.aai != null) {
	  writes += c.aai.appendLoopOnAppenders(event);
	}
	if(!c.additive) {
	  break;
	}
      }
    }
 
    if(writes == 0) {
      repository.emitNoAppenderWarning(this);
    }
  }

然後搜了網上的log4j問題,果然1.x版本是有這種問題的,後升級爲log4j2,沒在出現,問題解決

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章