校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 記一次tomcat進(jìn)程cpu占用過高的問題排查記錄

記一次tomcat進(jìn)程cpu占用過高的問題排查記錄

熱門標(biāo)簽:高德地圖標(biāo)注公司需要錢 地圖標(biāo)注能更改嗎 宜賓銷售外呼系統(tǒng)軟件 外呼系統(tǒng)全國 廈門防封電銷電話卡 四川保險(xiǎn)智能外呼系統(tǒng) 地圖標(biāo)注員有發(fā)展前景嗎 濰坊寒亭400電話辦理多少錢 云南電商智能外呼系統(tǒng)哪家好

本文主要記錄一次tomcat進(jìn)程,因TCP連接過多導(dǎo)致CPU占用過高的問題排查記錄。

問題描述

linux系統(tǒng)下,一個(gè)tomcat web服務(wù)的cpu占用率非常高,top顯示結(jié)果超過200%。請求無法響應(yīng)。反復(fù)重啟依然同一個(gè)現(xiàn)象。

問題排查

1、獲取進(jìn)程信息

通過jdk提供的jps命令可以快速查出jvm進(jìn)程,

jps pid

2、查看jstack信息

jstack pid

發(fā)現(xiàn)存在大量log4j線程block,處于waiting lock狀態(tài)

org.apache.log4j.Category.callAppenders(org.apache.log4j.spi.LoggingEvent) @bci=12, line=201 (Compiled frame)

搜索相關(guān)信息,發(fā)現(xiàn)log4j 1.x版本存在死鎖問題。

發(fā)現(xiàn)問題,于是調(diào)整log4j配置,僅打開error級別日志,重啟tomcat。此時(shí)stack中block線程消失,但進(jìn)程cpu占用率依然高漲。

3、進(jìn)一步排查

分析每個(gè)線程的cpu占用量,此處需要引入一個(gè)大神貢獻(xiàn)的腳本,計(jì)算java進(jìn)程中,每個(gè)線程的cpu使用量。

#!/bin/bash

typeset top=${1:-10}
typeset pid=${2:-$(pgrep -u $USER java)}
typeset tmp_file=/tmp/java_${pid}_$$.trace

$JAVA_HOME/bin/jstack $pid > $tmp_file
ps H -eo user,pid,ppid,tid,time,%cpu --sort=%cpu --no-headers\

    | tail -$top\

    | awk -v "pid=$pid" '$2==pid{print $4"\t"$6}'\

    | while read line;
do
    typeset nid=$(echo "$line"|awk '{printf("0x%x",$1)}')
    typeset cpu=$(echo "$line"|awk '{print $2}')
    awk -v "cpu=$cpu" '/nid='"$nid"'/,/^$/{print $0"\t"(isF++?"":"cpu="cpu"%");}' $tmp_file
done

rm -f $tmp_file

腳本適用范圍

因?yàn)閜s中的%CPU數(shù)據(jù)統(tǒng)計(jì)來自于/proc/stat,這個(gè)份數(shù)據(jù)并非實(shí)時(shí)的,而是取決于OS對其更新的頻率,一般為1S。所以你看到的數(shù)據(jù)統(tǒng)計(jì)會和jstack出來的信息不一致也就是這個(gè)原因~但這份信息對持續(xù)LOAD由少數(shù)幾個(gè)線程導(dǎo)致的問題排查還是非常給力的,因?yàn)檫@些固定少數(shù)幾個(gè)線程會持續(xù)消耗CPU的資源,即使存在時(shí)間差,反正也都是這幾個(gè)線程所導(dǎo)致。

除了這個(gè)腳本,簡單點(diǎn)兒的方法則是,查出進(jìn)程id后,通過如下命令查看該進(jìn)程中每個(gè)線程的資源使用情況

top -H -p pid

從這里獲取pid(線程id),轉(zhuǎn)換為16進(jìn)制,然后去stack信息中查找對象的線程信息。

通過上述方法,查出tomcat進(jìn)程對應(yīng)的線程cpu占用率累積之和約80%,遠(yuǎn)小于top給出的200%+

說明并不存在長期占用cpu的線程,應(yīng)該是屬于有許多短暫性的cpu密集計(jì)算。進(jìn)而懷疑是不是jvm內(nèi)存不足,頻繁gc導(dǎo)致。

jstat -gc pid

發(fā)現(xiàn)jvm內(nèi)存使用并未出現(xiàn)異常,gc次數(shù)明顯暴漲

查完內(nèi)存,由于本身是一個(gè)網(wǎng)絡(luò)程序,進(jìn)一步排查網(wǎng)絡(luò)連接。

4、問題定位

查詢tomcat對應(yīng)端口的tcp鏈接,發(fā)現(xiàn)存在大量EASTABLISH的鏈接,還有部分其它狀態(tài)的連接,總計(jì)400+。

netstat -anp | grep port

進(jìn)一步查看這些連接的來源,發(fā)現(xiàn)是該tomcat服務(wù)的應(yīng)用端,存在大量后臺線程,在頻繁輪詢該服務(wù),導(dǎo)致該服務(wù)tomcat 連接數(shù)被打滿,無法繼續(xù)接收請求。

netstat狀態(tài)說明:

  • LISTEN:偵聽來自遠(yuǎn)方的TCP端口的連接請求
  • SYN-SENT:再發(fā)送連接請求后等待匹配的連接請求(如果有大量這樣的狀態(tài)包,檢查是否中招了)
  • SYN-RECEIVED:再收到和發(fā)送一個(gè)連接請求后等待對方對連接請求的確認(rèn)(如有大量此狀態(tài),估計(jì)被flood***了)
  • ESTABLISHED:代表一個(gè)打開的連接
  • FIN-WAIT-1:等待遠(yuǎn)程TCP連接中斷請求,或先前的連接中斷請求的確認(rèn)
  • FIN-WAIT-2:從遠(yuǎn)程TCP等待連接中斷請求
  • CLOSE-WAIT:等待從本地用戶發(fā)來的連接中斷請求
  • CLOSING:等待遠(yuǎn)程TCP對連接中斷的確認(rèn)
  • LAST-ACK:等待原來的發(fā)向遠(yuǎn)程TCP的連接中斷請求的確認(rèn)(不是什么好東西,此項(xiàng)出現(xiàn),檢查是否被***)
  • TIME-WAIT:等待足夠的時(shí)間以確保遠(yuǎn)程TCP接收到連接中斷請求的確認(rèn)
  • CLOSED:沒有任何連接狀態(tài)

5、根源分析

直接觸發(fā)原因是客戶端輪詢,請求異常,繼續(xù)輪序;客戶端不斷有新的后臺線程加入輪詢隊(duì)伍,最終導(dǎo)致服務(wù)端tomcat連接被打滿。

到此這篇關(guān)于記一次tomcat進(jìn)程cpu占用過高的問題排查記錄的文章就介紹到這了,更多相關(guān)tomcat進(jìn)程cpu占用過高內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

標(biāo)簽:紅河 回訪 湛江 滁州 廣安 巴彥淖爾 德州 廊坊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《記一次tomcat進(jìn)程cpu占用過高的問題排查記錄》,本文關(guān)鍵詞  記,一次,tomcat,進(jìn)程,cpu,占,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《記一次tomcat進(jìn)程cpu占用過高的問題排查記錄》相關(guān)的同類信息!
  • 本頁收集關(guān)于記一次tomcat進(jìn)程cpu占用過高的問題排查記錄的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 巴里| 临桂县| 白山市| 韶山市| 新化县| 夏津县| 舞阳县| 塔河县| 布尔津县| 昌邑市| 南华县| 柳州市| 察雅县| 恩施市| 灌云县| 禄劝| 阳谷县| 石楼县| 资中县| 新巴尔虎右旗| 广水市| 阜康市| 海淀区| 綦江县| 新龙县| 浙江省| 正定县| 南岸区| 垫江县| 蓝田县| 陆河县| 铜梁县| 三原县| 西充县| 抚州市| 兴安盟| 台江县| 兴海县| 兴仁县| 民乐县| 蓝山县|