最近遇到一個(gè)java應(yīng)用造成了服務(wù)器CPU使用率過(guò)高坏晦,最后查詢慨绳,問(wèn)題是因?yàn)樵趖omcat下重新部署應(yīng)用的時(shí)候沒(méi)有kill掉tomcat進(jìn)程洼怔,造成應(yīng)用中的數(shù)據(jù)庫(kù)連接池進(jìn)程中的鎖不能被釋放虾攻,死循環(huán)造成了cpu使用率過(guò)高的現(xiàn)象,詳細(xì)原因就不做詳細(xì)分析了叶骨,主要分享一下問(wèn)題排查的過(guò)程。
使用top命令查詢服務(wù)cpu使用情況
服務(wù)器資源使用率
可以看到31737這個(gè)進(jìn)程的CPU使用率巨大
使用top -Hp 31737查詢31737進(jìn)程中各個(gè)線程的資源使用率
top -Hp 31737
使用top -Hp 31737查詢31737進(jìn)程中各個(gè)線程的資源使用率
31737進(jìn)程中各個(gè)線程的使用率
由于當(dāng)時(shí)的截圖丟失了祈匙,簡(jiǎn)單說(shuō)一下忽刽,使用top -Hp 31737命令查詢到31737進(jìn)程中,一個(gè)線程id為5322占用CPU過(guò)高
使用printf "%x\n" 5322把線程id轉(zhuǎn)化為十六進(jìn)制
printf "%x\n" 5322
因?yàn)榇蛴【€程棧的時(shí)候夺欲,本地線程標(biāo)識(shí)nid是用十六進(jìn)制表示的,使用該命令把線程id轉(zhuǎn)化為十六進(jìn)制
5322的十六進(jìn)制為14ca
使用jstack命令打印堆棧信息
jstack 31737 | grep -10 14ca
使用jstack 31737 | grep -10 14ca打印31737的堆棧信息跪帝,并查找本地線程標(biāo)識(shí)為14ca的線程堆棧信息
31737的堆棧信息
如圖,線程的狀態(tài)為T(mén)IMED_WAITING些阅,對(duì)象等待中伞剑,查看源碼
出現(xiàn)問(wèn)題的代碼
發(fā)現(xiàn)問(wèn)題的原因就不做詳細(xì)分析了,這里主要是分享一下問(wèn)題排查的過(guò)程
度娘一下有個(gè)大神回答的不錯(cuò)市埋,連接在這里黎泣,有興趣的可以自己去看一下https://stackoverflow.com/questions/6981564/why-must-the-jdbc-driver-be-put-in-tomcat-home-lib-folder/7198049#7198049
大神的回答
大致原因就是因?yàn)樵趖omcat下重新部署應(yīng)用的時(shí)候沒(méi)有kill掉tomcat進(jìn)程,造成應(yīng)用中的數(shù)據(jù)庫(kù)連接池進(jìn)程中的鎖不能被釋放
這次排查問(wèn)題的過(guò)程就為大家分享到這里缤谎,歡迎大家來(lái)交流抒倚,指出文中一些說(shuō)錯(cuò)的地方,讓我加深認(rèn)識(shí)坷澡,愿大家沒(méi)有bug托呕,謝謝!