> 技术文档 > Elasticsearch 内存占用排查指南_es 查看索引占用内存

Elasticsearch 内存占用排查指南_es 查看索引占用内存


目录

  • Elasticsearch 内存占用排查指南
    • 一、环境变量配置
    • 二、内存占用排查方法
      • (一)JVM 堆内存使用情况
      • (二)索引内存使用情况
      • (三)字段数据缓存
      • (四)查询缓存
      • (五)请求缓存
      • (六)脚本缓存
      • (七)文件系统缓存
      • (八)操作系统工具
      • (九)内存溢出数据
      • (十)段内存使用
    • 三、优化建议
      • (一)调整 JVM 堆内存配置
      • (二)优化垃圾回收
      • (三)缓存管理
      • (四)定期维护

Elasticsearch 内存占用排查指南

一、环境变量配置

为方便操作,先设置 Elasticsearch 服务地址的环境变量:

export es_url=\"http://:9200\"

替换 为实际主机名或 IP。若在 Kubernetes 环境中,可通过以下命令动态获取服务地址:

export es_url=http://$(kubectl get svc elasticsearch-logging -o jsonpath={\'.spec.clusterIP\'} -n qfusion):9200

验证变量是否生效:

echo $es_url

二、内存占用排查方法

(一)JVM 堆内存使用情况

查看各节点 JVM 堆内存指标,并将结果保存到文件:

curl -XGET \"${es_url}/_nodes/stats/jvm?pretty\" > jvm_heap_stats.txt

关键指标解释:

  • jvm.mem.heap_used_percent:当前堆内存使用率,建议保持在 70% 以下。
  • jvm.mem.heap_committed_in_bytesjvm.mem.heap_max_in_bytes:已分配及最大堆内存,用于评估堆内存配置合理性。
  • jvm.gc.collectors.young.collection_time_in_millisjvm.gc.collectors.old.collection_time_in_millis:新生代和老年代垃圾回收耗时,过高可能引发性能问题。

(二)索引内存使用情况

查看各索引的文档数量和存储大小,并将结果保存到文件:

curl -XGET \"${es_url}/_cat/indices?v&bytes=b\" > index_storage_stats.txt

关注以下指标:

  • docs.count:索引中文档数量,过多文档会加大内存压力。
  • store.sizepri.store.size:分别表示索引总存储大小和主分片存储大小,辅助评估存储资源占用。

(三)字段数据缓存

检查字段数据缓存使用量,并将结果保存到文件:

curl -XGET \"${es_url}/_nodes/stats?filter_path=**.fielddata\" > fielddata_cache_stats.txt

重点关注 fielddata.memory_size_in_bytes,字段数据缓存用于加速聚合和排序操作,过多使用会占用大量内存。

(四)查询缓存

查看查询缓存情况,并将结果保存到文件:

curl -XGET \"${es_url}/_nodes/stats?filter_path=**.query_cache\" > query_cache_stats.txt

关键指标:

  • query_cache.memory_size_in_bytes:查询缓存的内存使用量。
  • query_cache.hit_countquery_cache.miss_count:查询缓存命中和未命中次数,命中率低表示缓存效率不佳。

(五)请求缓存

检查请求缓存,并将结果保存到文件:

curl -XGET \"${es_url}/_nodes/stats?filter_path=**.request_cache\" > request_cache_stats.txt

关注指标:

  • request_cache.memory_size_in_bytes:请求缓存的内存使用量。
  • request_cache.hit_countrequest_cache.miss_count:请求缓存命中和未命中次数。

(六)脚本缓存

若使用动态脚本,查看脚本缓存情况,并将结果保存到文件:

curl -XGET \"${es_url}/_nodes/stats?filter_path=**.script\" > script_cache_stats.txt

关注 script.cache_evictions(脚本缓存驱逐次数)和 script.compilations(脚本编译次数),频繁编译和驱逐会增加内存压力。

(七)文件系统缓存

操作系统层面的文件系统缓存影响存储性能,查看缓存使用量:

free -h > filesystem_cache_stats.txt

关注 buff/cache 列,其显示文件系统缓存的使用量。

(八)操作系统工具

使用操作系统工具进一步分析内存使用:

  • 查看进程级别的内存使用情况:
    top > process_memory_usage.txt

    htop > htop_memory_usage.txt
  • 查看 Elasticsearch 进程的内存使用情况:
    ps aux | grep java > java_process_memory_usage.txt
  • 更详细的内存使用分析:
    smem -k -P java > smem_java_memory_usage.txt

(九)内存溢出数据

怀疑内存溢出时,检查 Elasticsearch 日志文件(通常在 logs 目录下),查找与内存相关的错误信息:

curl -XGET \"${es_url}/_nodes/stats?filter_path=**.mem\" > os_memory_stats.txt

关注指标:

  • os.mem.used_percent:操作系统内存使用率。
  • os.mem.total_in_bytes:总内存大小。

(十)段内存使用

查看各索引的段信息,并将结果保存到文件:

curl -XGET \"${es_url}/_cat/segments?v\" > segment_memory_stats.txt

关注 memory 列,显示每个段占用的内存大小。

三、优化建议

(一)调整 JVM 堆内存配置

合理设置堆内存大小,通常建议不超过物理内存的 50%,且不超过 32 GB。通过 jvm.heap.size 参数进行调整。

(二)优化垃圾回收

选择合适的垃圾回收器,如 G1 收集器,并根据实际需求调整垃圾回收参数:

-XX:+UseG1GC -XX:MaxGCPauseMillis=200

(三)缓存管理

根据实际负载情况,调整各类缓存的大小。如字段数据缓存、查询缓存和请求缓存等,避免缓存占用过多内存。

(四)定期维护

定期清理无用索引和数据,优化段合并,更新配置参数,保持集群高效运行。

通过以上方法和指标,可全面排查和优化 Elasticsearch 的内存占用情况,提升集群性能和稳定性。