当前位置: 首页 > news >正文

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

在使用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内存)

排查步骤

  1. 检查内存和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,说明内存压力较大。

  2. 列出高内存占用进程

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

    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
    ...
    
  3. 分析结果

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

解决方案

  1. 释放内存占用

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

    systemctl stop mongod
    
  2. 增加Swap空间

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

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

    检查是否生效:

    free -h
    
  3. 调整Elasticsearch的内存配置

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

    -Xms2g
    -Xmx2g
    
  4. 重启下mongo服务释放下内存

    docker restart mongo
    
  5. 重启服务

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

    docker restart elasticsearch
    

总结

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

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

相关文章:

  • Ubuntu 下测试 NVME SSD 的读写速度
  • Neo4j的部署和操作
  • react axios 优化示例
  • 探索数字化展馆:开启科技与文化的奇幻之旅
  • 基于深度学习的视觉检测小项目(七) 开始组态界面
  • AI赋能跨境电商:魔珐科技3D数字人破解出海痛点
  • 【C/C++】nlohmann::json从文件读取json,并进行解析打印,实例DEMO
  • 安装Anaconda搭建Python环境,并使用VSCode作为IDE运行Python脚本
  • 我用AI学Android Jetpack Compose之入门篇(1)
  • 使用 Docker 查看 Elasticsearch 错误日志
  • 使用Apache Mahout制作 推荐引擎
  • Elasticsearch:利用 AutoOps 检测长时间运行的搜索查询
  • python二元表达式 三元表达式
  • 计算机网络 (22)网际协议IP
  • 【UI自动化测试】selenium八种定位方式
  • REMARK-LLM:用于生成大型语言模型的稳健且高效的水印框架
  • Android SPRD 工模测试修改
  • H3C CN3360B光纤存储交换机配置案例
  • 问题:Flask应用中的用户会话(Session)管理失效
  • Backend - C# 操作数据库 DB(ADO.NET、LINQ to SQL、EF)
  • JMeter + Grafana +InfluxDB性能监控 (二)
  • springCloud实战
  • 从优化算法到分布式训练-提升AI模型收敛速度的系统性分析【附核心实战代码】
  • 如何在 Windows 10/11 上录制带有音频的屏幕 [3 种简单方法]
  • 鸿蒙应用开发(2)
  • 单片机-LED点阵实验
  • 微服务-Nacos(注册中心)
  • 【Linux知识】shell编程知识科普
  • 小程序学习06——uniapp组件常规引入和easycom引入语法
  • 平安产险安徽分公司携手安徽中医药临床研究中心附属医院 共筑儿童安全防护网