記一次線程爆滿導(dǎo)致服務(wù)器崩潰的問題排查及解決_第1頁
記一次線程爆滿導(dǎo)致服務(wù)器崩潰的問題排查及解決_第2頁
記一次線程爆滿導(dǎo)致服務(wù)器崩潰的問題排查及解決_第3頁
記一次線程爆滿導(dǎo)致服務(wù)器崩潰的問題排查及解決_第4頁
記一次線程爆滿導(dǎo)致服務(wù)器崩潰的問題排查及解決_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第記一次線程爆滿導(dǎo)致服務(wù)器崩潰的問題排查及解決目錄問題介紹1.重啟服務(wù)器2.修改最大線程數(shù)3.查找線程最大的java程序4.導(dǎo)出問題程序的線程日志5.找到問題代碼6.解決方案

問題介紹

測試服務(wù)器突然無法連接,ssh登錄不上。只有重啟才能解決。重啟一天后,又連接不上了。

于是有了下面的排查過程,最終發(fā)現(xiàn)是有個java程序一直在創(chuàng)建線程,導(dǎo)致線程達到服務(wù)器最大數(shù)量,服務(wù)器崩潰。

1.重啟服務(wù)器

重啟后,ssh連接發(fā)現(xiàn)下面問題

forkfaild:Cannotallocatememory

以為是內(nèi)存滿了

于是,free-h,查看內(nèi)存情況,還有,觀察一段時間后,內(nèi)存沒多大變化

2.修改最大線程數(shù)

經(jīng)過各種百度,都說可以通過修改服務(wù)器的最大線程數(shù)來解決,于是我也這么干了。當(dāng)時做的時候沒有截圖,所以下面截圖是網(wǎng)上找的,湊合看看。

查看最大進程數(shù)sysctlkernel.pid_max

ps-eLf|wc-l查看進程數(shù)

修改最大進程數(shù)后系統(tǒng)恢復(fù)

echo1000000/proc/sys/kernel/pid_max

永久生效

echo"kernel.pid_max=1000000"/etc/sysctl.conf

sysctl-p

3.查找線程最大的java程序

上一步擴大了線程數(shù)量后,感覺有點不對,因為之前沒有這么配置都可以正常運行,為什么突然服務(wù)器掛了呢?肯定是有程序在作怪。

于是決定找出占用線程最多的程序。回顧最近幾天,服務(wù)器中只部署了幾個springboot程序。問題一定出在它們之中。

查看線程數(shù)量前20的java程序

ps-Lef|awk‘{sum[$2]++}END{for(pidinsum)printpid,sum[pid]}'|sort-nr-k2|head-n20

[root@se-test-lky01~]#ps-Lef|awk'{sum[$2]++}END{for(pidinsum)printpid,sum[pid]}'|sort-nr-k2|head-n20

160743100

313861226

201201072

19548985

9697829

3005796

641344

19016324

16924315

17870300

6417293

8351171

7332168

18259167

19821161

16311157

18433151

18048136

14347104

2559100

觀察一段時間后,發(fā)現(xiàn)進程id為16074的java程序的線程數(shù)不斷增長。

4.導(dǎo)出問題程序的線程日志

[root@se-test-lky01~]#jstack16074thread_dump.log

分析日志,發(fā)現(xiàn)下面情況,線程數(shù)量不斷增加,代碼位置在FtpMonitorProcess.java:85

"Thread-4655"#4774prio=5os_prio=0tid=0x00007f84aa2fe000nid=0xd408bwaitingformonitorentry[0x00007f802b704000]

java.lang.Thread.State:BLOCKED(onobjectmonitor)

atcn.cloudwalk.bat.util.http.FtpUtil.connect(FtpUtil.java:246)

-waitingtolock0x00000006c09c1888(ajava.lang.Classforcn.cloudwalk.bat.util.http.FtpUtil)

atcess.FtpMonitorProcess$1.run(FtpMonitorProcess.java:85)

atjava.lang.Thread.run(Thread.java:748)

"Thread-4654"#4773prio=5os_prio=0tid=0x00007f84aa2fc000nid=0xd408awaitingformonitorentry[0x00007f802b805000]

java.lang.Thread.State:BLOCKED(onobjectmonitor)

atcn.cloudwalk.bat.util.http.FtpUtil.connect(FtpUtil.java:246)

-waitingtolock0x00000006c09c1888(ajava.lang.Classforcn.cloudwalk.bat.util.http.FtpUtil)

atcess.FtpMonitorProcess$2.run(FtpMonitorProcess.java:114)

atjava.lang.Thread.run(Thread.java:748)

5.找到問題代碼

發(fā)現(xiàn)這個方法每次被調(diào)用就會創(chuàng)建一個新的線程。而這個方法是被定時任務(wù)調(diào)用的,每10秒調(diào)用一次。

問題就出在ftp沒有配置,所以線程內(nèi)執(zhí)行ftp操作時,線程阻塞,沒能釋放。若ftp可用,則不會出現(xiàn)線程阻塞問題。

這就是問題根源。

privatevoidlistDeviceFiles(){

newThread(newRunnable(){

@Override

publicvoidrun(){

logger.debug("開始獲取[ftp-設(shè)備]文件...");

try{

StringworkDir=ftpConfig.getWorkdir();

//連接

FTPClientftpClient=FtpUtil.connect(ftpConfig);

ftpClient.changeWorkingDirectory(workDir);

ftpClient.changeWorkingDirectory(SubscribeDataTypeEnum.DEVICE_INFO.getKey().toString());

FTPFile[]files=ftpClient.listFiles();

for(FTPFilefile:files){

decomposeFile(file,ftpClient);

ftpClient.logout();

}catch

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論