最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

記一次線程爆滿導(dǎo)致服務(wù)器崩潰的問題排查及解決

 更新時(shí)間:2022年10月28日 08:52:22   作者:阿拉的夢(mèng)想  
這篇文章主要介紹了記一次線程爆滿導(dǎo)致服務(wù)器崩潰的問題排查及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

問題介紹

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

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

1. 重啟服務(wù)器

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

fork faild:Cannot allocate memory

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

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

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

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

查看最大進(jìn)程數(shù) sysctl kernel.pid_max

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

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

echo 1000000 > /proc/sys/kernel/pid_max

永久生效

echo "kernel.pid_max=1000000 " >> /etc/sysctl.conf
sysctl -p

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

上一步擴(kuò)大了線程數(shù)量后,感覺有點(diǎn)不對(duì),因?yàn)橹皼]有這么配置都可以正常運(yùn)行,為什么突然服務(wù)器掛了呢?肯定是有程序在作怪。

于是決定找出占用線程最多的程序?;仡欁罱鼛滋欤?wù)器中只部署了幾個(gè)springboot程序。問題一定出在它們之中。

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

ps -Lef |awk ‘{sum[$2]++}END{for(pid in sum) print pid, sum[pid]}'|sort -nr -k 2|head -n 20
[root@se-test-lky01 ~]# ps -Lef |awk '{sum[$2]++}END{for(pid in sum) print pid, sum[pid]}'|sort -nr -k 2|head -n 20
16074 3100
31386 1226
20120 1072
19548 985
9697 829
3005 796
641 344
19016 324
16924 315
17870 300
6417 293
8351 171
7332 168
18259 167
19821 161
16311 157
18433 151
18048 136
14347 104
2559 100

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

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

[root@se-test-lky01 ~]#jstack 16074 >thread_dump.log

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

"Thread-4655" #4774 prio=5 os_prio=0 tid=0x00007f84aa2fe000 nid=0xd408b waiting for monitor entry [0x00007f802b704000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at cn.cloudwalk.bat.util.http.FtpUtil.connect(FtpUtil.java:246)
	- waiting to lock <0x00000006c09c1888> (a java.lang.Class for cn.cloudwalk.bat.util.http.FtpUtil)
	at cn.cloudwalk.bat.schedule.ftp.process.FtpMonitorProcess$1.run(FtpMonitorProcess.java:85)
	at java.lang.Thread.run(Thread.java:748)

"Thread-4654" #4773 prio=5 os_prio=0 tid=0x00007f84aa2fc000 nid=0xd408a waiting for monitor entry [0x00007f802b805000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at cn.cloudwalk.bat.util.http.FtpUtil.connect(FtpUtil.java:246)
	- waiting to lock <0x00000006c09c1888> (a java.lang.Class for cn.cloudwalk.bat.util.http.FtpUtil)
	at cn.cloudwalk.bat.schedule.ftp.process.FtpMonitorProcess$2.run(FtpMonitorProcess.java:114)
at java.lang.Thread.run(Thread.java:748)

5. 找到問題代碼

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

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

這就是問題根源。

	private void listDeviceFiles() {
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				logger.debug("開始獲取[ftp-設(shè)備]文件...");
				try {
					String workDir = ftpConfig.getWorkdir();
					// 連接
					FTPClient ftpClient = FtpUtil.connect(ftpConfig);
					ftpClient.changeWorkingDirectory(workDir);
					ftpClient.changeWorkingDirectory(SubscribeDataTypeEnum.DEVICE_INFO.getKey().toString());
					FTPFile[] files = ftpClient.listFiles();
					for(FTPFile file : files) {
						decomposeFile(file,ftpClient);
					}
					ftpClient.logout();
				} catch (Exception e) {
					logger.error("ftp獲取文件名出錯(cuò):" + e.getMessage());
				}
			}
		}).start();
	}

6. 解決方案

不建議手動(dòng)創(chuàng)建線程,改用使用線程池。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • IDEA中maven依賴報(bào)紅的問題解決辦法

    IDEA中maven依賴報(bào)紅的問題解決辦法

    這篇文章主要給大家介紹了關(guān)于IDEA中maven依賴報(bào)紅的問題解決辦法,在使用IDEA過程中,經(jīng)常會(huì)出現(xiàn)maven依賴報(bào)紅的問題,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 23種設(shè)計(jì)模式(8) java外觀模式

    23種設(shè)計(jì)模式(8) java外觀模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java外觀模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java中的Lombok使用詳解

    Java中的Lombok使用詳解

    這篇文章主要介紹了Java中的Lombok使用詳解,Lombok是一個(gè)在Java開發(fā)過程中使用注解的方式,用于簡(jiǎn)化JavaBean的編寫,避免冗余和樣板式代碼的插入,使類的編寫更加簡(jiǎn)潔,需要的朋友可以參考下
    2023-08-08
  • SpringBoot Java后端實(shí)現(xiàn)okhttp3超時(shí)設(shè)置的方法實(shí)例

    SpringBoot Java后端實(shí)現(xiàn)okhttp3超時(shí)設(shè)置的方法實(shí)例

    Okhttp的使用沒有httpClient廣泛,網(wǎng)上關(guān)于Okhttp設(shè)置代理的方法很少,下面這篇文章主要給大家介紹了關(guān)于SpringBoot Java后端實(shí)現(xiàn)okhttp3超時(shí)設(shè)置的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Java實(shí)戰(zhàn)之醫(yī)院管理系統(tǒng)的實(shí)現(xiàn)

    Java實(shí)戰(zhàn)之醫(yī)院管理系統(tǒng)的實(shí)現(xiàn)

    這篇文章主要介紹了如何利用Java實(shí)現(xiàn)醫(yī)院管理系統(tǒng),文中用到的技術(shù)有:SpringBoot、Layui、Freemaker等,感興趣的同學(xué)可以了解一下
    2022-04-04
  • 為何Java單例模式我只推薦兩種

    為何Java單例模式我只推薦兩種

    這篇文章主要給大家介紹了關(guān)于Java單例模式推薦的兩種模式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • struts2通過action返回json對(duì)象

    struts2通過action返回json對(duì)象

    struts2通過action返回json對(duì)象其實(shí)很簡(jiǎn)單的,首先我們需要引入jar包,然后在寫一個(gè)簡(jiǎn)單的action就好了,接下來通過本文給大家介紹struts2通過action返回json對(duì)象的方法,感興趣的朋友一起看看吧
    2016-09-09
  • java利用jacob將word轉(zhuǎn)pdf

    java利用jacob將word轉(zhuǎn)pdf

    這篇文章主要為大家詳細(xì)介紹了java利用jacob將word轉(zhuǎn)pdf,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 為什么SpringMVC中請(qǐng)求的body不支持多次讀取

    為什么SpringMVC中請(qǐng)求的body不支持多次讀取

    這篇文章主要介紹了為什么SpringMVC中請(qǐng)求的body不支持多次讀取,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 使用maven工具解決jar包沖突或重復(fù)加載的問題

    使用maven工具解決jar包沖突或重復(fù)加載的問題

    這篇文章主要介紹了使用maven工具解決jar包沖突或重復(fù)加載的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評(píng)論

罗平县| 周口市| 凌海市| 蒙自县| 浪卡子县| 织金县| 南江县| 共和县| 门源| 中山市| 滨海县| 钟山县| 勃利县| 华宁县| 合阳县| 酒泉市| 临朐县| 十堰市| 玉田县| 宜君县| 南岸区| 广水市| 桂阳县| 丰都县| 如东县| 南陵县| 绍兴市| 海城市| 兰坪| 望江县| 班戈县| 若尔盖县| 阳春市| 监利县| 论坛| 永昌县| 玛沁县| 定远县| 雷山县| 平安县| 浏阳市|