Docker容器中Elasticsearch內(nèi)存不足問(wèn)題的排查與解決方案
在使用Docker運(yùn)行Elasticsearch(ES)時(shí),可能會(huì)遇到內(nèi)存不足的問(wèn)題,導(dǎo)致ES無(wú)法啟動(dòng)。以下是一次完整的排查和解決過(guò)程。
問(wèn)題描述
在啟動(dòng)ES時(shí),日志提示如下錯(cuò)誤:
# Native memory allocation (mmap) failed to map 5368709120 bytes for committing reserved memory. # There is insufficient memory for the Java Runtime Environment to continue.
通過(guò)進(jìn)一步檢查,發(fā)現(xiàn)Swap空間已滿,內(nèi)存也幾乎耗盡。
環(huán)境信息
- 主機(jī)內(nèi)存總量:63G
- Swap空間:2G(已滿)
- 主要運(yùn)行的進(jìn)程:
mongod(占用14.8GB內(nèi)存)java -jar parse_gx_20210903.jar(占用2.7GB內(nèi)存)- 多個(gè)
mongosh進(jìn)程(每個(gè)占用約350MB內(nèi)存)
排查步驟
檢查內(nèi)存和Swap使用情況
使用以下命令查看主機(jī)的內(nèi)存和Swap空間:
free -h
輸出結(jié)果:
total used free shared buff/cache available Mem: 63G 30G 4.8G 24G 28G 1.7G Swap: 2.0G 2.0G 0B
字段含義說(shuō)明
- total: 總內(nèi)存大小。
- used: 已使用的內(nèi)存量。
- free: 空閑的內(nèi)存量。
- shared: 被共享內(nèi)存占用的大小。
- buff/cache: 系統(tǒng)用于緩沖區(qū)和緩存的內(nèi)存量。
- available: 可用內(nèi)存量,這個(gè)值比
free更準(zhǔn)確,因?yàn)樗紤]了緩存可以被釋放的情況。 - Swap空間已滿。
- 可用內(nèi)存僅剩1.7G,說(shuō)明內(nèi)存壓力較大。
列出高內(nèi)存占用進(jìn)程
使用以下命令按內(nèi)存占用排序列出進(jìn)程:
ps aux --sort=-%mem | head -n 15
輸出部分內(nèi)容:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 97476 17.2 22.3 16422848 14817344 ? SLsl 2023 92351:21 mongod -f /mongo/config.conf root 16140 0.5 4.1 21645120 2755200 ? Sl 2024 2948:47 java -jar parse_gx_20210903.jar root 1642 0.0 1.4 1590720 980608 ? Ssl 2022 97:10 /usr/sbin/rsyslogd -n ...
分析結(jié)果
mongod進(jìn)程占用內(nèi)存最多,為14.8GB。- 一個(gè)Java進(jìn)程占用2.7GB。
- 多個(gè)
mongosh進(jìn)程共占用約4GB。
解決方案
釋放內(nèi)存占用
暫時(shí)停止一些非必要的服務(wù)來(lái)釋放內(nèi)存。
systemctl stop mongod
增加Swap空間
為避免未來(lái)出現(xiàn)類似問(wèn)題,可以增加Swap空間。
# 創(chuàng)建一個(gè)新的Swap文件 dd if=/dev/zero of=/swapfile bs=1G count=4 chmod 600 /swapfile mkswap /swapfile swapon /swapfile
檢查是否生效:
free -h
調(diào)整Elasticsearch的內(nèi)存配置
如果ES仍然報(bào)錯(cuò),可以調(diào)整其JVM配置文件(jvm.options),降低內(nèi)存需求。
-Xms2g -Xmx2g
重啟下mongo服務(wù)釋放下內(nèi)存
docker restart mongo
重啟服務(wù)
釋放內(nèi)存或增加Swap后,重啟Elasticsearch:
docker restart elasticsearch
總結(jié)
通過(guò)上述步驟,我們成功解決了ES因內(nèi)存不足無(wú)法啟動(dòng)的問(wèn)題。總結(jié)關(guān)鍵點(diǎn):
- 定期監(jiān)控內(nèi)存和Swap使用情況。
- 合理規(guī)劃主機(jī)資源,避免服務(wù)之間競(jìng)爭(zhēng)內(nèi)存。
- 增加Swap空間作為應(yīng)急方案。
- 重啟占用內(nèi)存大的mongo服務(wù),可以釋放一定內(nèi)存
- 優(yōu)化ES配置,降低內(nèi)存占用。
到此這篇關(guān)于Docker容器中Elasticsearch內(nèi)存不足問(wèn)題的排查與解決方案的文章就介紹到這了,更多相關(guān)Docker Elasticsearch內(nèi)存不足內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker-compose使用volumes注意項(xiàng)介紹
這篇文章主要介紹了docker-compose使用volumes注意項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Docker?安裝啟動(dòng)Jenkins的方法(docker-compose)
這篇文章主要介紹了Docker?安裝啟動(dòng)?Jenkins(docker-compose)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
docker run -v 掛載數(shù)據(jù)卷異常,容器狀態(tài)一直是restarting的解決
這篇文章主要介紹了docker run -v 掛載數(shù)據(jù)卷異常,容器狀態(tài)一直是restarting的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
關(guān)于docker無(wú)法正常下載鏡像的問(wèn)題小結(jié)
之前還可以正常下載鏡像,但是一段時(shí)間之后就無(wú)法下載了,猜測(cè)可能是政治原因,無(wú)法連接到國(guó)外服務(wù)器,所以我設(shè)置了阿里云的鏡像加速器,需要的朋友可以參考下2024-06-06
基于CentOS8系統(tǒng)使用Docker搭建Gitlab的詳細(xì)教程
這篇文章主要介紹了基于CentOS8系統(tǒng)使用Docker搭建Gitlab教程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10

