ToB企服应用市场:ToB评测及商务社交产业平台

标题: ES时序数据库的性能优化 [打印本页]

作者: 南飓风    时间: 7 小时前
标题: ES时序数据库的性能优化
本文重要是解说了Elasticsearch数据库的优化,大家可以看一下。因为当时实操中涉及了6版本和7版本的一起优化,所以内容上大家自行区分一下。
一、底子设置

1. jvm.options参数详解 差别版本java设置会不一样

-Xms12g
-Xmx12g
说明:

-XX:+AlwaysPreTouch

   JDK官方文档关于 AlwaysPreTouch 的表明是
在启动时就把参数里说好了的内存全部都分配了,会使得启动慢上一点,但后面访问时会更流畅,比如页面会连续分配,比如不会在晋升新生代到老生代时才去访问页面,导致GC停顿时间加长。
4. 我想说一下Linux内存分配、Linux OOM Killer、内存交换vm.swappiness参数 之间的一些理解:当ES进程向操作体系MMU申请分配内存时,操作体系内核分配的是假造内存,比如指定 -Xms=16G
那么只是告诉内核这个ES进程在启动的时候最需要16G内存,但是ES进程在启动后并不是立即就用了16G的内存。因此,随着ES的运行,ES进程访问假造内存时产生缺页错误(page
fault),然后内核为之分配实际的物理页面(这个过程也是需要开销的)。而如果在JVM启动时指定了AlwaysPreTouch,就会分配实际的物理内存,这样在发生YGC的时候,新生代对象晋升到老年代,淘汰老年代空间分配产生的缺页非常,从而淘汰YGC停顿时间。
  -XX:CMSInitiatingOccupancyFraction 设置成75

-XX:MaxTenuringThreshold 设置成6

-Xss 设置为1M。

2. Swapping内存交换设置

2.1 禁用内存交换(/proc/sys/vm/swappiness),表明为什么要禁用内存交换:
内存交换到磁盘对服务器性能来说是致命的。想想看一个内存的操作必须是快速的。如果内存交换到磁盘上,一个100微秒的操作大概变成10毫秒,再想想那么多10微秒的操作时延累加起来。不难看出swapping对于性能是多么可怕。 最好的办法就是在你的操作体系中完全禁用swapping

3. elasticsearch.yml设置

3.1 index设置

index 缓冲区大小 ,默以为整个堆空间的10%
  1. indices.memory.index_buffer_size: 20%
复制代码
3.2 搜索设置

数据检索和计数请求线程池设置它的类型默以为fixed,size默以为(可用处理器的数量* 3) / 2) + 1,
  1. thread_pool.search.size: 5
复制代码
数据检索和计数请求线程池队列,队列的size默以为1000。
  1. thread_pool.search.queue_size: 1000
复制代码
3.3 写入设置

⚠️这个参数慎用!强制修改cpu核数,以突破写线程数限制
如果CPU性能开销有余,可以设置为摆设机器的CPU核数
  1. # processors: 16
  2. # Bulk pool
  3. thread_pool.bulk.size: 16     es6写法
  4. thread_pool.write.size: 16     es7写法
复制代码
4.其他设置

4.1 集群熔断内存比例设置

  1. PUT /_cluster/settings
  2. {
  3.    "persistent" : {   
  4.         "indices.breaker.fielddata.limit": "60%",
  5.         "indices.breaker.request.limit": "40%",
  6.         "indices.breaker.total.limit": "70%"
  7. 。。。
  8.    }
复制代码
在elasticsearch.yml中也可以设置
⚠️谨慎设置,会影响查询和插入,产生错误

  1. {
  2.   "statusCode": 429,
  3.   "error": "Too Many Requests",
  4.   "message": "[circuit_breaking_exception]
  5.   [parent] Data too large, data for [<http_request>] would be [2087772160/1.9gb],
  6.   which is larger than the limit of [1503238553/1.3gb],
  7.   real usage: [2087772160/1.9gb],
  8.   new bytes reserved: [0/0b],
  9.   usages [request=0/0b, fielddata=1219/1.1kb, in_flight_requests=0/0b, accounting=605971/591.7kb],
  10.   with { bytes_wanted=2087772160 & bytes_limit=1503238553 & durability="PERMANENT" }"
  11. }
复制代码

4.1.1 fielddata内存限制设置

   indices.breaker.fielddata.limit:fielddata的内存限制,默认60%?? 7.0版本默认是 40%
  
4.1.2 request内存限制设置

查询本身也会对相应的延迟产生重大影响。为了在查询时不触发熔断并导致Elasticsearch集群处于不稳定状态,
   indices.breaker.request.limit:执行聚合的内存限制,默认40% 7.0版本默认是 60%
  4.1.3 总体内存限制设置

可以根据查询的复杂性将indices.breaker.total.limit设置为适合您的JVM堆大小。此设置的默认值是JVM堆的70%。
   indices.breaker.total.limit:综合上面两个,限制在70%以内 7.0版本默认是 90%
  4.2 避免脑裂

网络非常大概会导致集群中节点分别出多个地区,地区发现没有 Master 节点的时候,会推举出了自己地区内 Maste 节点,导致一个集群被分裂为多个集群,使集群之间的数据无法同步,我们称这种征象为脑裂。
为了防止脑裂,我们需要在 Master 节点的设置文件中添加如下参数:
   discovery.zen.minimum_master_nodes=(master_eligible_nodes/2)+1 //默认值为1
  
二、优化篇

1、写入速率优化

1.1 设置持久化异步延时提交

  1. XPUT http://xxxx:9200/m_pd_cu_id_gps_2es_inc_hi_out/_settings -d '
  2. {
  3.    "index.translog.durability" : "async",
  4.    "index.translog.sync_interval" : "30s",
  5.    "index.translog.flush_threshold_size" : "1024mb"
  6. }
复制代码
说明:

1.2设置写入并发数,调解 Bulk 线程池和队列

修改elasticsearch.yml
  1. thread_pool.bulk.size: 16         //es6写法
  2. thread_pool.write.size: 16        //es7写法
复制代码
1.3 段归并优化

(1) 归并线程的速率优化:
⚠️ 7.0版本不再支持
Lucene 以段的情势存储数据。当有新的数据写入索引时,Lucene 就会主动创建一个新的段。随着数据量的变革,段的数量会越来越多,消耗的多文件句柄数及 CPU 就越多,查询服从就会降落。
由于 Lucene 段归并的盘算量巨大,会消耗大量的 I/O,所以 ES 默认采用较守旧的计谋,让配景定期举行段归并,如下所述:

  1. PUT _cluster/settings
  2. {
  3.     "persistent" : {
  4.         "indices.store.throttle.max_bytes_per_sec" : "100mb"
  5.     }
  6. }
复制代码
// 相应效果如下:
  1. {
  2.     "acknowledged": true,
  3.     "persistent": {
  4.         "indices": {
  5.             "store": {
  6.                 "throttle": {
  7.                     "max_bytes_per_sec": "100mb"
  8.                 }
  9.             }
  10.         }
  11.     },
  12.     "transient": {}
  13. }
复制代码
(2) 归并线程的数量:
保举设置为CPU焦点数的一半, 如果磁盘性能较差, 可以适当低沉设置, 避免发生磁盘IO堵塞:
  1. PUT employee/_settings
  2. {
  3.     "index.merge.scheduler.max_thread_count" : 8
  4. }
复制代码
也可以在elasticsearch.yml 设置:
  1. index.merge.schedule`Ω`r.max_thread_count: 1
复制代码
说明:

(3) 归并计谋:目前大概用不到,高版本不再支持
merge计谋index.merge.policy有三种:
tiered(默认计谋);log_byete_size; log_doc。
  1. # 优先归并小于此值的segment, 默认是2MB:
  2. index.merge.policy.floor_segment
  3. # 一次最多归并多少个segment, 默认是10个:
  4. index.merge.policy.max_merge_at_once
  5. # 一次直接归并多少个segment, 默认是30个
  6. index.merge.policy.max_merge_at_once_explicit
  7. # 大于此值的segment不参与归并, 默认是5GB. optimize操作不受影响
  8. index.merge.policy.max_merged_segment
复制代码
(4)重并发缓存加大
设置索引缓冲buffer,最大512m,默认值是jvm的10%;
elasticsearch.yml :
  1. indices.memory.index_buffer_size : 20%
  2. indices.memory.min_index_buffer_size: 96mb
复制代码

2、查询速率优化

2.1 特定搜索场景,增加搜索线程池设置

默认情况下,Elasticsearch将重要用例是搜索。在需要增加检索并发性的情况下,可以增加用于搜索设置的线程池,与此同时,可以根据节点上的CPU中的焦点数量多少斟酌淘汰用于索引的线程池。
举例:更改设置文件elasticsearch.yml增加如下内容:
  1. thread_pool.search.queue_size: 500
复制代码
#queue_size允许控制没有线程执行它们的挂起请求队列的初始大小。
2.2 低沉刷新频率设置
  1. 10.10.60.15:9200/str/_settings -d
  2. {
  3.        "refresh_interval": "5s"
  4. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4