Filebeat占用CPU过高问题定位与分析

发布时间 2023-10-26 11:57:14作者: RICH-ATONE

一、Filebeat简介:

Filebeat是一个开源的轻量级日志收集器,用于将日志数据发送到指定的中央服务系统。主要分为三个部分。

Prospector
负责检测指定日志目录或文件,并对检测到的每个日志文件,filebeat启动一个收割进程(harvester),Filebeat目前支持两种Prospector类型:log和stdin,每个Prospector类型可以在配置文件中定义多个。

Harvester
负责读取单个文件内容,harvester负责文件的打开和关闭,并将读取到的新内容发送到处理程序(spooler)

Spooler
集合harvester发送的数据,并将数据发送到指定地点。 Filebeat保持每个文件的状态,并频繁地将Harvester上次读取文件的位置从注册表更新到磁盘,确保将全部的日志数据读取出来。
如果output出行故障,Filebeat会将最后的文件读取位置保存下来,直到output恢复快速地对文件进行读取;如果Filebeat故障重启,会从注册表恢复重启之前的状态信息,让Filebeat继续从之前已知的位置开始进行读取。

二、CPU过高原因分析:

考虑可能造成Filebeat CPU的原因:

1、配置问题

配置统一采用运维打包filebeat,并且采用 yum源安装。并对比filebeat国内外服务发现配置完全一样,未做其他变更。

2、日志量过大

日志量均在可控范围内,海外项目数据量均偏少:

韩国妖尾项目日增数据量为:217407条左右

放开三国3项目日增数据量为:20385029条。

放开那三国3cpu占用量较少出现过高问题。

3、版本不兼容问题

 检查filebeat和kafka属于兼容版本,且为官方样例版本。

4、网络波动问题

和运维对接分析,考虑之前PJ及其他国际服项目,采用外网服务,网络波动相对较大。考虑往kafka发送阶段,filebeat获取kafka topic元数据相对缓慢,频繁获取可能导致负载过高。

5、向运维相关人员寻求分析CPU过高问题

检查配置海外节点均为4核左右,负载在0.3~1.7之间,CPU普遍占用量在20%~170%之间,整体负载低于50%以下,认为在合理范围内。

三、性能监控与对比分析:

①基于Filebeat配置优化处理:

max_procs: 2 参数限制核数为1核或者2核,CPU使用量在控制在可控范围内,配置后,发现CPU使用有所下降,负载在0.2~1.0之间,使用量在20%及以上,依然过高。

②各项目对比分析:

挑选国服放三3和日本PJ项目进行具体对比分析:

a、发现三国3采集的数据存在定时归档行为,海外项目归档行为人为不定期归档,数据目录过多。考虑是否为不归档造成CPU使用量过高。

b、协商运维同学对日本PJ项目aliyunjp-pj-data-logic-237-6节点的历史数据进行归档打包并压缩处理,处理后经top命令发现CPU恢复正常范围,负载明显减低,均处于20%以下,图示如下;

 

三、基于go tool pprof插件,针对韩国妖尾项目检测filebeat的CPU具体占用情况。

1、filebeat启动添加pprof功能:--httpprof 0.0.0.0:6060

2、运维安装go tool相关环境,top -cum命令查看消耗cpu的几个进程。

pirate   22429 19105  0 15:50 pts/5    00:00:00 grep --color=auto filebeat
pirate   26545     1 99 12:09 ?        07:03:57 /home/pirate/programs/filebeat/filebeat -c filebeat.yml --httpprof 0.0.0.0:6060
[pirate@kor-krft-data-40-157 ~]$ go tool pprof http://localhost:6060/debug/pprof/profile
Fetching profile over HTTP from http://localhost:6060/debug/pprof/profile
top
Saved profile in /home/pirate/pprof/pprof.filebeat.samples.cpu.002.pb.gz
File: filebeat
Build ID: 929062942e72425e2e93652bda4c5e296694c954
Type: cpu
Time: Oct 23, 2023 at 3:52pm (KST)
Duration: 30s, Total samples = 3.41s (11.37%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) 
(pprof) top -cum
Showing nodes accounting for 0.91s, 26.69% of 3.41s total
Dropped 95 nodes (cum <= 0.02s)
Showing top 10 nodes out of 178
      flat  flat%   sum%        cum   cum%
         0     0%     0%      1.89s 55.43%  github.com/elastic/beats/filebeat/input.(*Runner).Run
         0     0%     0%      1.89s 55.43%  github.com/elastic/beats/filebeat/input.(*Runner).Start.func1
         0     0%     0%      1.89s 55.43%  github.com/elastic/beats/filebeat/input/log.(*Input).Run
         0     0%     0%      1.75s 51.32%  github.com/elastic/beats/filebeat/input/log.(*Input).scan
     0.01s  0.29%  0.29%      1.71s 50.15%  github.com/elastic/beats/filebeat/input/log.(*Input).getFiles
         0     0%  0.29%      1.33s 39.00%  path/filepath.Glob
         0     0%  0.29%      1.33s 39.00%  path/filepath.glob
     0.01s  0.29%  0.59%      1.06s 31.09%  runtime.systemstack
     0.89s 26.10% 26.69%      0.91s 26.69%  syscall.Syscall6
         0     0% 26.69%      0.68s 19.94%  syscall.fstatat

  Syscall6简介:

1、在 pprof 中,Syscall6 函数类型通常会出现在 CPU profile 的结果中,用于显示程序在运行过程中调用 Syscall6 函数的情况。Syscall6 的出现可能意味着某些操作需要与操作系统进行交互,例如文件读写、网络通信等。
2、通过查看 Syscall6 函数相关的调用栈信息,可以帮助分析和优化程序中与系统调用相关的性能问题。可以关注调用频率高的 Syscall6 函数,以确定是否存在潜在的性能瓶颈或效率低下的代码逻辑。

详细的可以通过"go tool pprof --http="0.0.0.0:8086" /home/pirate/programs/filebeat/pprof.filebeat.samples.cpu.002.pb.gz"命令显示上述cpu.002.pb.gz web界面。(注:需要安装一些go等相关环境)

pprof web主页面(有堆栈、内存、CPU各项参数,可以具体分析CPU占用相关函数等)