中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決由docker容器“ java.lang.OutOfMemoryError”引發的環境崩潰

發布時間:2021-11-01 15:17:44 來源:億速云 閱讀:1344 作者:柒染 欄目:系統運維

本篇文章給大家分享的是有關如何解決由docker容器“ java.lang.OutOfMemoryError”引發的環境崩潰,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

問題描述:

2019.9.16下午2:40左右發現環境出現故障,功能無法正常運行。

馬上進行排查
1、基礎服務端口運行都是正常的
2、查看環境上最近有新發版的三個微服務,發現都在不同頻率的打印這句日志:

2019-09-16 14:42:41,626  INFO [DubboMonitor.java:80] :  [DUBBO] Send statistics to monitor zookeeper://192.168.1.101:2181/com.alibaba.dubbo.monitor.MonitorService?anyhost=true&application=dubbo-monitor&check=false&delay=-1&dubbo=crud&generic=false&interface=com.alibaba.dubbo.monitor.MonitorService&methods=lookup,collect&pid=11&revision=monitors&side=provider×tamp=1568598922300, dubbo version: crud, current host: 10.42.91.223

因為之前有一個微服務出現OutOfMemoryError的時候,就有一直打印這些日志,因此將三個容器日志導出來查看,剛剛導了兩個日志,正在導第三個日志的時候,發現docker命令無法執行,docker掛了???

先重新啟動了docker服務,恢復了業務,然后查看docker掛掉的原因。

原因分析:

1、查看/var/log/messages日志

將messages文件中跟docker有關的內容過濾出來,發現了這樣的信息(部分日志):

Sep 16 14:43:07 rancher-node dockerd-current: time="2019-09-16T14:43:07.982713104+08:00" level=error msg="collecting stats for 587cf4938bed5e3172868d85ae41db3af37e9c1a6cd8192f1cfa22a4e969d53b: rpc error: code = 2 desc = fork/exec /usr/libexec/docker/docker-runc-current: cannot allocate memory: \"\""
Sep 16 14:45:04 rancher-node journal: Suppressed 1116 messages from /system.slice/docker.service
Sep 16 14:45:05 rancher-node dockerd-current: time="2019-09-16T14:45:05.410928493+08:00" level=info msg="Processing signal 'terminated'"
Sep 16 14:45:05 rancher-node journal: time="2019-09-16T06:45:05Z" level=error msg="Error processing event &events.Message{Status:\"kill\", ID:\"af42628b1354b74d08b195c0064d8c5d760c826626a3ad36501a85c824d2204d\", From:\"prod.locmn.cn/prod/locmn-drols-query-chq:latest\", Type:\"container\", Action:\"kill\", ..... Error: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"

就是說在14:45的時候,docker就已經無法分配到內存了
然后信號終止,docker進程被殺掉,因此docker的命令無法運行,所有docker容器也都一起掛掉了:

Sep 16 14:45:05 rancher-node dockerd-current: time="2019-09-16T14:45:05.410928493+08:00" level=info msg="Processing signal 'terminated(處理信號的終止)'"
Sep 16 14:45:05 rancher-node journal: time="2019-09-16T06:45:05Z" level=error msg="Error processing event &events.Message{Status:\"kill\", ID:\"af42628b1354b74d08b195c0064d8c5d760c826626a3ad36501a85c824d2204d\", From:\"registry.locman.cn/sefon-online/locman-drools-query-chq:latest\", Type:\"container\", Action:\"kill\", ......Error: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"

可是為什么分配不到內存呢?
查看了主機,內存還有10G的。

2、查看業務日志

后面細查新發版的三個微服務的業務的日志,發現在14:03分的時候,有一個叫cud的服務有“java.lang.OutOfMemoryError”的報錯:

2019-09-16 14:03:10,554 ERROR [ExceptionFilter.java:87] :  [DUBBO] Got unchecked and undeclared exception which called by 10.42.83.124. service: com.run.locman.api.crud.service.AlarmInfoCrudService, method: add, exception: java.lang.OutOfMemoryError: unable to create new native thread, dubbo version: crud, current host: 10.42.91.223
java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
......(省略部分日志內容)
Exception in thread "pool-1-thread-3" java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:714)

原來是這個叫cud服務的內存溢出了引發的故障,導致了docker服務被kill掉,所有的docker容器瞬間全部掛掉!

故障原因總結

和開發一起對故障進行了分析,發現有兩個原因:
1、這個服務有一個線程池,在代碼里面設置的最小是8,最大限制是2147483647 ,用完的線程要1分鐘之后才能回收。這就存在兩個問題:
一、業務在持續不斷的發送請求,這個服務就會一直創建線程,而因為給定的線程最大值過大,相當于可以無限制的創建線程了,會一直消耗資源;
二、用完的線程1分鐘之后才會回收,時間過長。
在這兩點的影響下,程序跑一段時間,就會出現創建大量的線程,過度的消耗內存資源.

2、由于docker容器在最初的時候沒有做容器的內存限制,所以默認情況下容器使用的資源是不受限制的。
也就是可以使用主機內核調度器所允許的最大資源,因此當主機發現內存不夠用的時候,也會拋出內存溢出的錯誤。而且會開始殺死一些進程用于釋放內存空間。可怕的是任何進程都可能成為內核獵殺的對象,包括 docker daemon 和宿主機上的其它一些重要的程序。更危險的是如果某個支持系統運行的重要進程被kill掉了,整個系統也就宕掉了。
這次的docker服務進程就被殺掉了。

解決方案

1、開發優化代碼,包括限制線程池的最大線程數量和線程回收的時間,重新發布代碼打補丁,后面觀察到目前,沒有再出現類這個問題了;
2、限制docker內存。重新優化了docker容器,限制了docker內存的使用量,減少docker容器過度占用宿主機資源的風險;
3、加強對docker容器的監控與告警;

總結

1、docker限制內存,非常重要!
2、限制內存的方式(放一個別人寫的修改內存的步驟):

方法一:靜態修改 -m
-m參數:限制docker容器最大使用內存

例如:$ docker run -it -m 300M --memory-swap -1 --name con1 u-stress /bin/bash
上面的 docker run 命令中通過 -m 選項限制容器使用的內存上限為 300M。
同時設置 memory-swap 值為 -1,它表示容器程序使用內存的受限,而可以使用的 swap 空間使用不受限制(宿主機有多少 swap 容器就可以使用多少)。

方法二:動態修改 docker update
docker update  動態修改docker容器內存

例如:把一個運行著gitlab 的容器內存限制在2048M以內
docker update --memory 2048m --memory-swap -1 gitlab

以上就是如何解決由docker容器“ java.lang.OutOfMemoryError”引發的環境崩潰,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德州市| 明水县| 秦安县| 南通市| 佳木斯市| 通许县| 肥西县| 彩票| 淮滨县| 太仆寺旗| 馆陶县| 莱西市| 同心县| 永安市| 清镇市| 大兴区| 连云港市| 双桥区| 龙陵县| 尉犁县| 英吉沙县| 青龙| 陵水| 合阳县| 资讯| 盐池县| 会东县| 宜都市| 濉溪县| 晋中市| 电白县| 洮南市| 芜湖市| 五指山市| 张家界市| 汝南县| 喀什市| 南汇区| 浠水县| 楚雄市| 乌恰县|