1. 背景
由于目前日志采集流程中, 经常遇到用户磁盘 IO 占用超过 90% 以上的场景, 但是观察其日志量大约在 2k~5k 之间, 整体数据量不大, 所以针对该问题进行了一系列的压测和实验验证,最后得出这篇优化建议文档
该阶段为数据源输入阶段, 为了避免瓶颈在数据制造侧, 所以需要保证 filebeat 具有足够的日志制造能力
最后效果, filebeat 可以达到 70k QPS 的数据发往logstash . (真实数据可以更高, 70k qps 是因为目前单实例 logstash 的 CPU 计算瓶颈, logstash 配置的 output 为空的情况下)
Logstash 主要是 cpu 密集型服务, 数据传输到 es 的时候为了观察方便, 设置 logstash 副本数为 1, 并将 cpu 的 limit 开放到 12 core. 同时为了避免影响到 es, 将 该单实例 logstash 部署到 master 节点
验证性能方案
不断调节 logstash 配置, 找出性能消耗较大的配置项
根据之前的推断, 磁盘 io 主要由于 es index 写入进行的消耗, 所以 es 是本次调节的重点, 暂时保持配置不变, 在验证过程中不断调节 es 配置
mutate remove_field 处理消耗大量 cpu, 可以将部分操作移动到 filebeat 中
pipeline.batch.size: 500
pipeline.batch.delay: 200
空间换时间, 内存会有小幅上升, 但是会提升 cpu 处理效率
由于 logstash 没有 switch 等语句, 只能嵌套多个 if else. 所以可以将中日志频率高的 event code 放在前面
Logstash 提供了 logstash pipeline 机制, 避免 filter 之间的相互影响
参考: Creating a Logstash pipeline | Logstash Reference [8.15] | Elastic
索引模版增加 合并相关参数
{
"index": {
"codec": "best_compression",
"mapping": {
"total_fields": {
"limit": "10000"
}
},
"refresh_interval": "30s",
"translog": {
"flush_threshold_size": "512mb",
"sync_interval": "10s",
"durability": "async"
},
"merge": {
"scheduler": {
"max_thread_count": "1"
},
"policy": {
"floor_segment": "2mb",
"max_merge_at_once": "5",
"max_merged_segment": "5gb"
}
}
}
}
将各个索引模版增加以上参数, 各参数解释
关闭强制合并, 避免在 index 读写较高时, 进行合并操作, 可以在空闲时段离线进行合并操作
将临近删除的数据, 增加温阶段, 合并 segement 和降低副本数, 以此达到降低磁盘使用量的目的
硬盘: 机械硬盘, vmware 虚拟盘
Logstash 配置: 单实例 12 核 8g
ES data 配置: 双实例 12 核 8g
极限情况下(磁盘 io 成为瓶颈的情况下)
峰值: 12k qps
平均值: 9k qps
收益
优化前 峰值 5k qps
优化后 峰值 12k qps