目录
1.ELK优化
ELK优化可以围绕着 linux内核优化、JVM优化、ES配置优化、架构优化(filebeat/fluentd代替logstash、加入kafka做消息队列)来实现。
ES 作为日志存储时的特性是:高并发写、读少、接受 30 秒内的延时、可容忍部分日志数据丢失。
2.优化 ES 索引设置
2.1 优化 fsync
2.2 优化 refresh
2.3 优化 merge
2.4 优化设置
2.5 打开索引
3.优化线程池配置
- write 线程池满负荷,导致拒绝任务,而有的数据无法写入。而经过上面的优化后,拒绝的情况少了很多,但是还是有拒绝任务的情况。所以我们还需要优化 write 线程池。
- write 线程池采用 fixed 类型的线程池,也就是核心线程数与最大线程数值相同。线程数默认等于 cpu 核数,可设置的最大值只能是 cpu 核数加 1,比如 16 核的 CPU, 能设置的线程数最大值为 17。
3.1 优化的方案
4.锁定内存,不让 JVM 使用 Swap
- Swap交换分区:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到 Swap 中,等到那些程序要运行时,再从 Swap 中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行 Swap 交换。
- Swap 交换分区对性能和节点稳定性非常不利,一定要禁用。它会导致垃圾回收持续几分钟而不是几毫秒,并会导致节点响应缓慢,甚至与集群断开连接。
有三种方式可以实现 ES 不使用 Swap 分区
(1)Linux 系统中的关闭 Swap (临时有效)
执行命令 sudo swapoff -a
可以临时禁用 Swap 内存,但是操作系统重启后失效
(2)Linux 系统中的尽可能减少 Swap 的使用(永久有效)
执行下列命令
echo "vm.swappiness = 1" >> /etc/sysctl.conf
正常情况下不会使用 Swap,除非紧急情况下才会 Swap。
(3)启用 bootstrap.memory_lock
config/elasticsearch.yml 文件增加配置
#锁定内存,不让 JVM 写入 Swap,避免降低 ES 的性能
bootstrap.memory_lock: true
5.减少分片数、副本数
(1)分片
索引的大小取决于分片与段的大小,分片过小,可能导致段过小,进而导致开销增加;分片过大可能导致分片频繁 Merge,产生大量 IO 操作,影响写入性能。
因为我们每个索引的大小在 15G 以下,而默认是 5 个分片,没有必要这么多,所以调整为 3 个。
"index.number_of_shards": "3"
(2)副本数
减少集群副本分片数,过多副本会导致 ES 内部写扩大。副本数默认为 1,如果某索引所在的 1 个节点宕机,拥有副本的另一台机器拥有索引备份数据,可以让索引数据正常使用。但是数据写入副本会影响写入性能。对于日志数据,有 1 个副本即可。 对于大数据量的索引,可以设置副本数为 0,减少对性能的影响。
"index.number_of_replicas": "1"