ELK性能优化实战分析,IDEA太强悍了

优化后

优化后

每秒打印一次 GC 数据。可以看出,新生代增长速度慢了许多,至少要 60 秒才会满,如上图红框中数据,进入老年代的对象约(15.68-15.60)/100 * 10000 = 8M,非常的少。所以要很久才会触发一次 Full GC 。而且等到 Full GC 时,老年代里很多对象都是存活了很久的,一般都是不会被引用,所以很大一部分会被回收掉,留一个比较干净的老年代空间,可以继续放很多对象。

1.5.2 新生代和老年代 GC 频率更低

ES 启动后,运行14个小时

优化前

Young GC 每次的时间是不长的,从上面监控数据中可以看出每次GC时长 1467.995/27276 约等于 0.05 秒。那一秒钟有多少时间是在处理 Young GC ?

计算公式:1467 秒/( 60 秒× 60 分 14 小时)= 约 0.028 秒,也就是 100 秒中就有 2.8 秒在Young GC,也就是有 2.8S 的停顿,这对性能还是有很大消耗的。同时也可以算出多久一次 Young GC, 方程是:60秒×60分*14小时/ 27276次 = 1次/X秒,计算得出X = 0.54,也就是 0.54 秒就会有一次 Young GC,可见 Young GC 频率非常频繁。

优化后

Young GC 次数只有修改前的十分之一,Young GC 时间也是约八分之一。Full GC 的次数也是只有原来的八分之一,GC 时间大约是四分之一。

GC 对系统的影响大大降低,性能已经得到很大的提升。

2.ES 调优

上面已经分析过 ES 作为日志存储时的特性是:高并发写、读少、接受 30 秒内的延时、可容忍部分日志数据丢失。下面我们针对这些特性对ES进行调优。

2.1 优化 ES 索引设置

2.2.1 ES 写数据底层原理

refresh ES 接收数据请求时先存入 ES 的内存中,默认每隔一秒会从内存 buffer 中将数据写入操作系统缓存 os cache,这个过程叫做 refresh;

到了 os cache 数据就能被搜索到(所以我们才说 ES 是近实时的,因为 1 s 的延迟后执行 refresh 便可让数据被搜索到)

fsync translog 会每隔 5 秒或者在一个变更请求完成之后执行一次 fsync 操作,将 translog 从缓存刷入磁盘,这个操作比较耗时,如果对数据一致性要求不是很高时建议将索引改为异步,如果节点宕机时会有5秒数据丢失;

flush ES 默认每隔30分钟会将 os cache 中的数据刷入磁盘同时清空 translog 日志文件,这个过程叫做 flush。

merge

ES 的一个 index 由多个 shard 组成,而一个 shard 其实就是一个 Lucene 的 index ,它又由多个 segment 组成,且 Lucene 会不断地把一些小的 segment 合并成一个大的 segment ,这个过程被称为段merge(参考文末链接)。执行索引操作时,ES 会先生成小的segment,ES 有离线的逻辑对小的 segment 进行合并,优化查询性能。但是合并过程中会消耗较多磁盘 IO,会影响查询性能。

2.2.2 优化方向
2.2.2.1 优化 fsync

为了保证不丢失数据,就要保护 translog 文件的安全:

Elasticsearch 2.0 之后, 每次写请求(如 index 、delete、update、bulk 等)完成时, 都会触发fsync将 translog 中的 segment 刷到磁盘, 然后才会返回200 OK的响应;

或者: 默认每隔5s就将 translog 中的数据通过fsync强制刷新到磁盘.

该方式提高数据安全性的同时, 降低了一点性能.

==> 频繁地执行 fsync 操作, 可能会产生阻塞导致部分操作耗时较久. 如果允许部分数据丢失, 可设置异步刷新 translog 来提高效率,还有降低 flush 的阀值,优化如下:

“index.translog.durability”: “async”,
“index.translog.flush_threshold_size”:“1024mb”,
“index.translog.sync_interval”: “120s”

2.2.2.2 优化 refresh

写入 Lucene 的数据,并不是实时可搜索的,ES 必须通过 refresh 的过程把内存中的数据转换成 Lucene 的完整 segment 后,才可以被搜索。

默认 1秒后,写入的数据可以很快被查询到,但势必会产生大量的 segment,检索性能会受到影响。所以,加大时长可以降低系统开销。对于日志搜索来说,实时性要求不是那么高,设置为 5 秒或者 10s;对于 SkyWalking,实时性要求更低一些,我们可以设置为 30s。

设置如下:

“index.refresh_interval”:“5s”

2.2.2.3 优化 merge

index.merge.scheduler.max_thread_count 控制并发的 merge 线程数,如果存储是并发性能较好的 SSD,可以用系统默认的 max(1, min(4, availableProcessors / 2)),当节点配置的 cpu 核数较高时,merge 占用的资源可能会偏高,影响集群的性能,普通磁盘的话设为1,发生磁盘 IO 堵塞。设置max_thread_count 后,会有 max_thread_count + 2 个线程同时进行磁盘操作,也就是设置为 1 允许3个线程。

设置如下:

“index.merge.scheduler.max_thread_count”:“1”

2.2.2 优化设置
2.2.2.1 对现有索引做索引设置

需要先 close 索引,然后再执行,最后成功之后再打开

关闭索引

curl -XPOST ‘http://localhost:9200/_all/_close’

修改索引设置

curl -XPUT -H “Content-Type:application/json” ‘http://localhost:9200/_all/_settings?preserve_existing=true’ -d ‘{“index.merge.scheduler.max_thread_count” : “1”,“index.refresh_interval” : “10s”,“index.translog.durability” : “async”,“index.translog.flush_threshold_size”:“1024mb”,“index.translog.sync_interval” : “120s”}’

打开索引

curl -XPOST ‘http://localhost:9200/_all/_open’

该方式可对已经生成的索引做修改,但是对于后续新建的索引不生效,所以我们可以制作 ES 模板,新建的索引按模板创建索引。

2.2.2.2 制作索引模板

制作模板 大部分索引都是业务应用的日志相关的索引,且索引名称是 202* 这种带着日期的格式

PUT _template/business_log
{
“index_patterns”: [“202..”],
“settings”: {
“index.merge.scheduler.max_thread_count” : “1”,“index.refresh_interval” : “5s”,“index.translog.durability” : “async”,“index.translog.flush_threshold_size”:“1024mb”,“index.translog.sync_interval” : “120s”}
}

查询模板是否创建成功

GET _template/business_log

因为我们的业务日志是按天维度创建索引,索引名称示例:user-service-prod-2020.12.12,所以用通配符*202..**匹配对应要创建的业务日志索引。

2.2 优化线程池配置

前文已经提到过,write 线程池满负荷,导致拒绝任务,而有的数据无法写入。

而经过上面的优化后,拒绝的情况少了很多,但是还是有拒绝任务的情况。

所以我们还需要优化 write 线程池。

从 prometheus 监控中可以看到线程池的情况:

为了更直观看到 ES 线程池的运行情况,我们安装了 elasticsearch_exporter 收集 ES 的指标数据到 prometheus,再通过 grafana 进行查看。

经过上面的各种优化,拒绝的数据量少了很多,但是还是存在拒绝的情况,如下图:

write 线程池如何设置:

参考文末链接:ElasticSearch线程池

write

For single-document index/delete/update and bulk requests. Thread pool type is fixed with a size of # of available processors, queue_size of 200. The maximum size for this pool is 1 + # of available processors.

write 线程池采用 fixed 类型的线程池,也就是核心线程数与最大线程数值相同。线程数默认等于 cpu 核数,可设置的最大值只能是 cpu 核数加 1,也就是 16 核 CPU,能设置的线程数最大值为 17。

优化的方案:

  • 线程数改为 17,也就是 cpu 总核数加 1
  • 队列容量加大。队列在此时的作用是消峰。不过队列容量加大本身不会提升处理速度,只是起到缓冲作用。此外,队列容量也不能太大,否则积压很多任务时会占用过多堆内存。

config/elasticsearch.yml文件增加配置

线程数设置

thread_pool:
write:

线程数默认等于cpu核数,即16

size: 17

因为任务多时存在任务拒绝的情况,所以加大队列大小,可以在间歇性任务量陡增的情况下,缓存任务在队列,等高峰过去逐步消费完。

queue_size: 10000

优化后效果图片

可以看到,已经没有拒绝的情况,这样也就是解决了日志丢失的问题。

2.3 锁定内存,不让 JVM 使用 Swap

Swap 交换分区:

当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,**这些被释放的空间被临时保存到 Swap 中,等到那些程序要运行时,再从 Swap 中恢复保存的数据到内存中。**这样,系统总是在物理内存不够时,才进行 Swap 交换。

参考文末链接:ElasticSearch官方解释为什么要禁用交换内存

Swap 交换分区对性能和节点稳定性非常不利,一定要禁用。它会导致垃圾回收持续几分钟而不是几毫秒,并会导致节点响应缓慢,甚至与集群断开连接。

有三种方式可以实现 ES 不使用 Swap 分区

2.3.1 Linux 系统中的关闭 Swap (临时有效)

执行命令

sudo swapoff -a

可以临时禁用 Swap 内存,但是操作系统重启后失效

2.3.2 Linux 系统中的尽可能减少 Swap 的使用(永久有效)

执行下列命令

echo “vm.swappiness = 1”>> /etc/sysctl.conf

正常情况下不会使用 Swap,除非紧急情况下才会 Swap。

2.3.3 启用 bootstrap.memory_lock

config/elasticsearch.yml 文件增加配置

#锁定内存,不让 JVM 写入 Swap,避免降低 ES 的性能
bootstrap.memory_lock: true

2.4 减少分片数、副本数

分片

索引的大小取决于分片与段的大小,分片过小,可能导致段过小,进而导致开销增加;分片过大可能导致分片频繁 Merge,产生大量 IO 操作,影响写入性能。

因为我们每个索引的大小在 15G 以下,而默认是 5 个分片,没有必要这么多,所以调整为 3 个。

“index.number_of_shards”: “3”

分片的设置我们也可以配置在索引模板。

副本数

减少集群副本分片数,过多副本会导致 ES 内部写扩大。副本数默认为 1,如果某索引所在的 1 个节点宕机,拥有副本的另一台机器拥有索引备份数据,可以让索引数据正常使用。但是数据写入副本会影响写入性能。对于日志数据,有 1 个副本即可。对于大数据量的索引,可以设置副本数为0,减少对性能的影响。

“index.number_of_replicas”: “1”

分片的设置我们也可以配置在索引模板。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

img
img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
img

最后

小编利用空余时间整理了一份《MySQL性能调优手册》,初衷也很简单,就是希望能够帮助到大家,减轻大家的负担和节省时间。

关于这个,给大家看一份学习大纲(PDF)文件,每一个分支里面会有详细的介绍。

image

这里都是以图片形式展示介绍,如要下载原文件以及更多的性能调优笔记(MySQL+Tomcat+JVM)!
mg-65BL1U1B-1711546325565)]

最后

小编利用空余时间整理了一份《MySQL性能调优手册》,初衷也很简单,就是希望能够帮助到大家,减轻大家的负担和节省时间。

关于这个,给大家看一份学习大纲(PDF)文件,每一个分支里面会有详细的介绍。

[外链图片转存中…(img-jbgEsu1a-1711546325565)]

这里都是以图片形式展示介绍,如要下载原文件以及更多的性能调优笔记(MySQL+Tomcat+JVM)!

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值