ElasticSearch教程FG018-ElasticSearch性能优化与JVM调优
内容简介:本文档风哥主要介绍ElasticSearch的性能优化和JVM调优方法,包括硬件资源规划、JVM参数配置、索引性能优化、搜索性能优化等方面。通过学习本文,您将掌握如何通过合理的配置和优化手段,提升ElasticSearch集群的性能和稳定性。风哥教程参考ElasticSearch官方文档Performance Tuning部分。
Part01-基础概念与理论知识
1.1 ElasticSearch性能影响因素
影响ElasticSearch性能的主要因素包括:
- 硬件资源:CPU、内存、磁盘I/O、网络带宽
- JVM配置:堆内存大小、GC策略、内存分配
- 索引设计:分片数、副本数、映射设计、分析器选择
- 查询优化:查询语句设计、缓存使用、过滤条件
- 系统配置:操作系统参数、文件系统、网络设置
1.2 JVM内存管理原理
ElasticSearch基于Java开发,JVM内存管理对其性能至关重要:
- 堆内存:存储对象实例,分为年轻代和老年代
- 非堆内存:存储类元数据、常量池等
- 垃圾回收(GC):清理不再使用的对象,释放内存
- 内存分配策略:对象在不同代之间的移动和回收
1.3 性能优化方法论
性能优化的一般步骤:
- 建立性能基准:测量当前系统的性能指标
- 识别性能瓶颈:通过监控和分析找出瓶颈所在
- 制定优化方案:根据瓶颈制定相应的优化措施
- 实施优化:应用优化措施并验证效果
- 持续监控:定期检查性能,确保优化效果持久
Part02-生产环境规划与建议
2.1 硬件资源规划
生产环境硬件资源建议:
- CPU:8核以上,优先选择高主频CPU
- 内存:32GB以上,建议为服务器总内存的50%分配给JVM堆内存
- 存储:使用SSD存储,提供高IOPS
- 网络:千兆以上网络,集群内节点间使用万兆网络
- 磁盘空间:预留足够的空间,至少为数据量的2-3倍
2.2 JVM参数配置建议
JVM参数配置建议:
- 堆内存大小:设置为服务器总内存的50%,最大不超过32GB
- 年轻代大小:设置为堆内存的1/3到1/2
- GC策略:使用G1 GC(ElasticSearch 7.0+默认)
- 内存分配:使用内存锁定,避免内存交换
- 日志配置:启用GC日志,便于分析GC情况
2.3 操作系统优化建议
操作系统优化建议:
- 文件描述符:设置为65536以上
- 虚拟内存:禁用透明大页(THP)
- 交换空间:设置合理的交换空间,或禁用交换
- CPU调度:使用性能模式,避免节能模式
- 磁盘I/O:使用NOOP或CFQ调度器,优化磁盘性能
Part03-生产环境项目实施方案
3.1 JVM堆内存调优
JVM堆内存调优步骤:
vi /es/app/elasticsearch-8.10.0/config/jvm.options
# 设置堆内存大小
-Xms16g
-Xmx16g
# 使用G1 GC
-XX:+UseG1GC
# 启用内存锁定
-XX:+AlwaysPreTouch
# GC日志配置
-Xlog:gc*,gc+age=trace,safepoint:file=/es/fgdata/logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m
3.2 GC策略优化
G1 GC优化建议:
-XX:MaxGCPauseMillis=200
-XX:ParallelGCThreads=8
-XX:ConcGCThreads=2
-XX:InitiatingHeapOccupancyPercent=75
3.3 索引性能优化
索引性能优化措施:
- 批量索引:使用批量API,减少网络开销
- 合理设置刷新间隔:增加refresh_interval,减少I/O操作
- 禁用副本:在初始索引时禁用副本,完成后再启用
- 使用自动生成的ID:避免ID冲突检查
- 优化映射:合理设置字段类型,避免不必要的字段
3.4 搜索性能优化
搜索性能优化措施:
- 使用过滤查询:将不需要评分的条件放在filter中
- 合理使用缓存:利用查询缓存和过滤器缓存
- 优化查询语句:避免使用复杂的查询,如wildcard查询
- 分页优化:使用scroll API或search_after进行深分页
- 减少返回字段:只返回需要的字段,减少网络传输
Part04-生产案例与实战讲解
4.1 JVM参数调优实战
调整JVM参数以优化性能:
curl -X GET “http://192.168.1.10:9200/_nodes/jvm?pretty”
执行后输出:
“_nodes” : {
“total” : 3,
“successful” : 3,
“failed” : 0
},
“cluster_name” : “fgedu-cluster”,
“nodes” : {
“node1” : {
“name” : “fgedu-node1”,
“transport_address” : “192.168.1.10:9300”,
“host” : “fgedu-node1”,
“ip” : “192.168.1.10”,
“version” : “8.10.0”,
“build_flavor” : “default”,
“build_type” : “tar”,
“build_hash” : “1a822671c7b74444896024a8b6794f63471c5267”,
“roles” : [ “data”, “ingest”, “master”, “ml”, “remote_cluster_client”, “transform” ],
“attributes” : {
“ml.machine_memory” : “33554432000”,
“xpack.installed” : “true”,
“transform.node” : “true”
},
“jvm” : {
“pid” : 12345,
“version” : “17.0.8”,
“vm_name” : “OpenJDK 64-Bit Server VM”,
“vm_version” : “17.0.8+7”,
“vm_vendor” : “Eclipse Adoptium”,
“start_time_in_millis” : 1680000000000,
“mem” : {
“heap_init_in_bytes” : 17179869184,
“heap_max_in_bytes” : 17179869184,
“non_heap_init_in_bytes” : 76677120,
“non_heap_max_in_bytes” : 0,
“direct_max_in_bytes” : 8589934592
},
“gc_collectors” : [ “G1 Young Generation”, “G1 Old Generation” ],
“memory_pools” : [
{
“name” : “G1 Eden Space”,
“type” : “HEAP”,
“collection_used_in_bytes” : 0,
“collection_max_in_bytes” : 0,
“used_in_bytes” : 5726622720,
“committed_in_bytes” : 8589934592,
“peak_used_in_bytes” : 8589934592,
“peak_committed_in_bytes” : 8589934592,
“max_in_bytes” : 0
},
{
“name” : “G1 Survivor Space”,
“type” : “HEAP”,
“collection_used_in_bytes” : 0,
“collection_max_in_bytes” : 0,
“used_in_bytes” : 0,
“committed_in_bytes” : 0,
“peak_used_in_bytes” : 0,
“peak_committed_in_bytes” : 0,
“max_in_bytes” : 0
},
{
“name” : “G1 Old Gen”,
“type” : “HEAP”,
“collection_used_in_bytes” : 0,
“collection_max_in_bytes” : 0,
“used_in_bytes” : 2863311552,
“committed_in_bytes” : 8589934592,
“peak_used_in_bytes” : 8589934592,
“peak_committed_in_bytes” : 8589934592,
“max_in_bytes” : 17179869184
}
],
“gc” : {
“collectors” : {
“G1 Young Generation” : {
“collection_count” : 123,
“collection_time_in_millis” : 4567
},
“G1 Old Generation” : {
“collection_count” : 12,
“collection_time_in_millis” : 7890
}
}
}
}
}
}
}
4.2 索引性能优化实战
优化索引性能:
curl -X PUT “http://192.168.1.10:9200/fgedu-products-optimized” -H “Content-Type: application/json” -d ‘{
“settings”: {
“number_of_shards”: 5,
“number_of_replicas”: 0,
“refresh_interval”: “30s”,
“index”: {
“codec”: “best_compression”,
“translog”: {
“durability”: “async”,
“flush_threshold_size”: “512mb”
}
}
},
“mappings”: {
“properties”: {
“product_id”: {
“type”: “keyword”
},
“product_name”: {
“type”: “text”,
“analyzer”: “ik_smart”
},
“price”: {
“type”: “double”
},
“category”: {
“type”: “keyword”
}
}
}
}’
执行后输出:
“acknowledged” : true,
“shards_acknowledged” : true,
“index” : “fgedu-products-optimized”
}
curl -X POST “http://192.168.1.10:9200/fgedu-products-optimized/_bulk” -H “Content-Type: application/json” -d ‘{
“index”: {“_id”: “1”}
{“product_id”: “P001”, “product_name”: “ElasticSearch实战指南”, “price”: 89.9, “category”: “技术书籍”}
{“index”: {“_id”: “2”}
{“product_id”: “P002”, “product_name”: “Java核心技术”, “price”: 129.9, “category”: “技术书籍”}
{“index”: {“_id”: “3”}
{“product_id”: “P003”, “product_name”: “Python数据分析”, “price”: 99.9, “category”: “技术书籍”}
}’
执行后输出:
“took” : 123,
“errors” : false,
“items” : [
{
“index” : {
“_index” : “fgedu-products-optimized”,
“_id” : “1”,
“_version” : 1,
“result” : “created”,
“_shards” : {
“total” : 1,
“successful” : 1,
“failed” : 0
},
“_seq_no” : 0,
“_primary_term” : 1
}
},
{
“index” : {
“_index” : “fgedu-products-optimized”,
“_id” : “2”,
“_version” : 1,
“result” : “created”,
“_shards” : {
“total” : 1,
“successful” : 1,
“failed” : 0
},
“_seq_no” : 1,
“_primary_term” : 1
}
},
{
“index” : {
“_index” : “fgedu-products-optimized”,
“_id” : “3”,
“_version” : 1,
“result” : “created”,
“_shards” : {
“total” : 1,
“successful” : 1,
“failed” : 0
},
“_seq_no” : 2,
“_primary_term” : 1
}
}
]
}
curl -X PUT “http://192.168.1.10:9200/fgedu-products-optimized/_settings” -H “Content-Type: application/json” -d ‘{
“number_of_replicas”: 2
}’
4.3 搜索性能优化实战
优化搜索性能:
curl -X GET “http://192.168.1.10:9200/fgedu-products-optimized/_search” -H “Content-Type: application/json” -d ‘{
“query”: {
“bool”: {
“must”: [
{
“match”: {
“product_name”: “ElasticSearch”
}
}
],
“filter”: [
{
“range”: {
“price”: {
“lte”: 100
}
}
},
{
“term”: {
“category”: “技术书籍”
}
}
]
}
},
“_source”: [“product_id”, “product_name”, “price”],
“size”: 10
}’
执行后输出:
“took” : 5,
“timed_out” : false,
“_shards” : {
“total” : 5,
“successful” : 5,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : {
“value” : 1,
“relation” : “eq”
},
“max_score” : 0.6931472,
“hits” : [
{
“_index” : “fgedu-products-optimized”,
“_id” : “1”,
“_score” : 0.6931472,
“_source” : {
“product_id” : “P001”,
“product_name” : “ElasticSearch实战指南”,
“price” : 89.9
}
}
]
}
}
4.4 系统资源优化实战
优化操作系统参数:
ulimit -n
# 设置文件描述符限制
echo “* soft nofile 65536” >> /etc/security/limits.conf
echo “* hard nofile 65536” >> /etc/security/limits.conf
# 禁用透明大页
echo “never” > /sys/kernel/mm/transparent_hugepage/enabled
echo “never” > /sys/kernel/mm/transparent_hugepage/defrag
# 配置内核参数
echo “vm.swappiness = 1” >> /etc/sysctl.conf
echo “vm.max_map_count = 262144” >> /etc/sysctl.conf
sysctl -p
Part05-风哥经验总结与分享
5.1 性能优化最佳实践
- 合理规划硬件资源:根据业务需求选择合适的硬件配置
- 优化JVM配置:合理设置堆内存大小和GC策略
- 优化索引设计:根据数据特点设计合理的索引结构
- 优化查询语句:使用过滤查询,减少不必要的计算
- 合理使用缓存:充分利用ElasticSearch的缓存机制
- 定期维护索引:执行索引优化和碎片合并
- 监控系统性能:建立完善的监控体系,及时发现问题
5.2 常见性能问题与解决方案
- GC频繁:调整JVM堆内存大小,优化GC策略
- 索引速度慢:使用批量索引,调整刷新间隔,优化映射
- 搜索响应时间长:优化查询语句,使用过滤查询,合理使用缓存
- 磁盘I/O高:使用SSD存储,优化索引设置,调整刷新间隔
- 内存使用高:优化JVM配置,减少字段数,使用合理的字段类型
5.3 性能测试与基准评估
性能测试建议:
- 使用专业工具:如elasticsearch-benchmarks、Apache JMeter等
- 模拟真实场景:根据实际业务场景设计测试用例
- 测量关键指标:索引速度、搜索响应时间、系统资源使用率等
- 对比不同配置:测试不同配置下的性能表现
- 建立性能基线:记录正常运行时的性能指标,作为参考标准
更多视频教程www.fgedu.net.cn
学习交流加群风哥微信: itpux-com
学习交流加群风哥QQ113257174
风哥提示:性能优化是一个持续的过程,需要根据实际情况不断调整和改进
更多学习教程公众号风哥教程itpux_com
from ElasticSearch视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
