Docker容器中Elasticsearch内存不足问题的排查与解决方案

 更新时间:2025年08月21日 10:38:34   作者:一勺菠萝丶  
在使用Docker运行Elasticsearch(ES)时,可能会遇到内存不足的问题,导致ES无法启动,以下是一次完整的排查和解决过程,需要的朋友可以参考下

在使用Docker运行Elasticsearch(ES)时,可能会遇到内存不足的问题,导致ES无法启动。以下是一次完整的排查和解决过程。

问题描述

在启动ES时,日志提示如下错误:

# Native memory allocation (mmap) failed to map 5368709120 bytes for committing reserved memory.
# There is insufficient memory for the Java Runtime Environment to continue.

通过进一步检查,发现Swap空间已满,内存也几乎耗尽。

环境信息

  • 主机内存总量:63G
  • Swap空间:2G(已满)
  • 主要运行的进程:
    • mongod(占用14.8GB内存)
    • java -jar parse_gx_20210903.jar(占用2.7GB内存)
    • 多个mongosh进程(每个占用约350MB内存)

排查步骤

检查内存和Swap使用情况

使用以下命令查看主机的内存和Swap空间:

free -h

输出结果:

              total        used        free      shared  buff/cache   available
Mem:            63G         30G        4.8G         24G         28G        1.7G
Swap:          2.0G        2.0G          0B

字段含义说明

  • total: 总内存大小。
  • used: 已使用的内存量。
  • free: 空闲的内存量。
  • shared: 被共享内存占用的大小。
  • buff/cache: 系统用于缓冲区和缓存的内存量。
  • available: 可用内存量,这个值比free更准确,因为它考虑了缓存可以被释放的情况。
  • Swap空间已满。
  • 可用内存仅剩1.7G,说明内存压力较大。

列出高内存占用进程

使用以下命令按内存占用排序列出进程:

ps aux --sort=-%mem | head -n 15

输出部分内容:

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
...

分析结果

  • mongod进程占用内存最多,为14.8GB。
  • 一个Java进程占用2.7GB。
  • 多个mongosh进程共占用约4GB。

解决方案

释放内存占用

暂时停止一些非必要的服务来释放内存。

systemctl stop mongod

增加Swap空间

为避免未来出现类似问题,可以增加Swap空间。

# 创建一个新的Swap文件
dd if=/dev/zero of=/swapfile bs=1G count=4
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

检查是否生效:

free -h

调整Elasticsearch的内存配置

如果ES仍然报错,可以调整其JVM配置文件(jvm.options),降低内存需求。

-Xms2g
-Xmx2g

重启下mongo服务释放下内存

docker restart mongo

重启服务

释放内存或增加Swap后,重启Elasticsearch:

docker restart elasticsearch

总结

通过上述步骤,我们成功解决了ES因内存不足无法启动的问题。总结关键点:

  • 定期监控内存和Swap使用情况。
  • 合理规划主机资源,避免服务之间竞争内存。
  • 增加Swap空间作为应急方案。
  • 重启占用内存大的mongo服务,可以释放一定内存
  • 优化ES配置,降低内存占用。

到此这篇关于Docker容器中Elasticsearch内存不足问题的排查与解决方案的文章就介绍到这了,更多相关Docker Elasticsearch内存不足内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker-compose使用volumes注意项介绍

    docker-compose使用volumes注意项介绍

    这篇文章主要介绍了docker-compose使用volumes注意项,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Docker 安装启动Jenkins的方法(docker-compose)

    Docker 安装启动Jenkins的方法(docker-compose)

    这篇文章主要介绍了Docker 安装启动 Jenkins(docker-compose)的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Docker 清理环境操作

    Docker 清理环境操作

    这篇文章主要介绍了Docker 清理环境操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • docker常用命令整理汇总(新手必备!)

    docker常用命令整理汇总(新手必备!)

    这篇文章主要给大家介绍了关于docker常用命令的相关资料,包括docker的启动、停止、重启、创建、查看等等,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • 深入解析docker三种网络模式

    深入解析docker三种网络模式

    这篇文章主要介绍了docker三种网络模式,分别是bridge桥接模式,host主机模式,none无网络模式,每种模式给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • docker run -v 挂载数据卷异常,容器状态一直是restarting的解决

    docker run -v 挂载数据卷异常,容器状态一直是restarting的解决

    这篇文章主要介绍了docker run -v 挂载数据卷异常,容器状态一直是restarting的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • docker 跨平台构建镜像的示例详解

    docker 跨平台构建镜像的示例详解

    这篇文章主要介绍了docker跨平台构建镜像的案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 关于docker无法正常下载镜像的问题小结

    关于docker无法正常下载镜像的问题小结

    之前还可以正常下载镜像,但是一段时间之后就无法下载了,猜测可能是政治原因,无法连接到国外服务器,所以我设置了阿里云的镜像加速器,需要的朋友可以参考下
    2024-06-06
  • Docker之容器导出为镜像问题

    Docker之容器导出为镜像问题

    这篇文章主要介绍了Docker之容器导出为镜像问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 基于CentOS8系统使用Docker搭建Gitlab的详细教程

    基于CentOS8系统使用Docker搭建Gitlab的详细教程

    这篇文章主要介绍了基于CentOS8系统使用Docker搭建Gitlab教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10

最新评论