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_bytes
和jvm.mem.heap_max_in_bytes
:已分配及最大堆内存,用于评估堆内存配置合理性。jvm.gc.collectors.young.collection_time_in_millis
和jvm.gc.collectors.old.collection_time_in_millis
:新生代和老年代垃圾回收耗时,过高可能引发性能问题。
(二)索引内存使用情况
查看各索引的文档数量和存储大小,并将结果保存到文件:
curl -XGET \"${es_url}/_cat/indices?v&bytes=b\" > index_storage_stats.txt
关注以下指标:
docs.count
:索引中文档数量,过多文档会加大内存压力。store.size
和pri.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_count
和query_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_count
和request_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 的内存占用情况,提升集群性能和稳定性。