记Filebeat系统资源使用优化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记Filebeat系统资源使用优化相关的知识,希望对你有一定的参考价值。

参考技术A 本文重点:

本文将着重关注filebeat,在filebeat在生产部署后,必定会对服务CPU、内存、网络有影响,如果将这些因素都在可控范围内,那是完全可以接受的。但是可能由于我们的配置不合理,或者非预期的情况导致CPU、内存占用过大,势必会影响到同在一起的业务应用稳定性。

我们将在本文一步步介绍我们在使用过程中遇到的问题,配置的优化,如何确保filebeat部署在业务主机上对业务的影响降到最低,如何使用cgroup来限制filebeat的系统资源使用配额!

有些文章说filebeat的内存消耗很少,不会超过100M,这是没有针对场景和没有经过测试不严谨的说法(刚开始我们也没有完全覆盖所有情况进行测试,当然部分偶然情况有时无法预知),当真正按照默认的简单配置将filebeat部署到生产环境,或者某个参数配置错误,都可能会出现意想不到的问题,轻则影响服务的整体性能,重则可能造成应用被OOM-killer导致业务中断。我们在刚开始使用filebeat时,觉得这个组件已经如此成熟,应该问题不大。所以使用了最简单最基本的配置将其部署,为后来的问题埋下了祸根!

我们在实际使用中的确遇到了如下问题:

来看几个问题样本:

这是初版的配置文件,相对简单,基本没有做什么特殊的配置:

我们接收业务反馈CPU占据到了300%上下(四核),并且偶现开头出现的OOM现象。

经过文档的查阅,发现几个明显的配置问题,并针对其做过一次初步的优化

初步调整:

上面的改动,以为已经控制住问题,但是在不久之后还是反复出现了多次同样的OOM问题

filebeat限制单条消息最大不能超过20k,默认内存队列存储4096条记录,再加上明文日志,最高内存理论最高值在 20k * 4096 * 2 = 160M 左右浮动,即使做了以上限制,还是不时出现内存爆增的情况

一时没有找到问题解决方案,我们做了如下的几个阶段策略:

阶段一:降低非预期情况下对应用的影响

阶段二:重新梳理和优化配置,达到优化内存的目的

降低非预期情况下对应用的影响,是将filebeat进程的oom_score_adj值设置为999,在出现意外情况时OOM也优先 kill 掉filebeat,从而达到即使出现意外情况,也不会影响到业务进程

具体的操作是:

启动filebeat -> 获取进程PID -> 写入/proc/$pid/oom_score_adj 为999

针对多次问题的场景,进行样本的提取,发现多次问题出现的都是在大量的堆栈异常日志中出现,怀疑是多行合逻辑不对导致的问题:

下面我们来着重看一下多行最初配置:

发现官网对于此参数的默认值是5s,但是现在却被误配置成了30s,肯定是有问题的啦

问题的原因应该就在 multiline.timeout 这个参数之上,我们尝试调整多次参数的大小进行测试:

我的对官方的这句话的理解是:

如果日志中如果包含很多错误堆栈,或者不规范的日志大量匹配多行逻辑,会产生过多的多行合并任务,但是超时时间过长,过多的任务就会最大限度的匹配和在内存中等待,占用更多的内存!

除此以外我们也做了其他调整包括但不限于如下:

queue.mem.events :从默认的4096 设置到了2048

queue.mem.flush.min_events : 从默认2048设置到了1536

multiline.max_lines :从默认500行设置到了200行

最后我们的最优配置如下,在调整之后将问题样本进行测试,内存只占用350M~500M之间:

对于我们的业务机器来说,让filebeat独占一个CPU去进行日志收集,显然不被业务人员所接受,因为在业务高峰期日志量会很大,filebaat进行大吞吐量的日志收集、多行合并、消息发送;很有可能会限制业务的性能,可能没有filebeat我原本需要10台主机,但是有了filebeat我就需要15台主机来承载高峰业务。

上面的配置虽然已经基本控制住内存用量,但也有可能出现不同的不可预期的情况导致内存增长

我们该如何限制CPU使用量和应对意想不到的内存增长情况?

答案是:绝对性的控制CPU/内存在一个范围内,我们可以使用cgroup来实现

什么是cgroup?

cgroup相关的所有操作都是基于内核中的cgroup virtual filesystem,使用cgroup很简单,挂载这个文件系统即可。一般情况默认已经挂载到 /sys/fs/cgroup 目录下了

mount | grep cgroup 查看系统默认是否挂载cgroup,cgroup包含很多子系统,用来控制进程不同的资源使用,我们只用其中cpu和memory这两个

filebeat_cpu和filebeat_memory下都会自动生成与上级目录相同的文件,我们重点关注一下几个文件

改造我们的filebeat启动脚本,支持在启动后限制内存和cpu:

限制:

CPU -> 单核25%

内存 -> 500M,大于此值则触发cgroup的OOM-killer机制

优化前:

优化后:

Filebeat +Redis+ELK处理Nginx日志系统

(一)简述:

 filebeat:具有日志收集功能,是下一代的Logstash收集器,但是filebeat更轻量,占用资源更少,适合客户端使用。

  redis:Redis 服务器通常都是用作 NoSQL 数据库,不过 logstash 只是用来做消息队列。

  logstash:主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。

  elasticsearch:Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

  kibana:Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

下图展示的基本的架构图。

技术分享图片

(二)具体步骤

1、filebeat的简介和具体配置
Filebeat是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并且转发这些信息到elasticsearch或者logstarsh、redis中存放

1.1、工作原理
filebeat由2个主要组件构成:prospector和harvesters。这两类组件一起协同完成Filebeat的工作,从指定文件中把数据读取出来,然后发送事件数据到配置的output中。

harvesters:主要负责进行单个文件的内容收集;在运行过程中,每一个Harvester会对一个文件逐行进行内容读取,并且把读写到的内容发送到配置的output中。

Prospector负责管理Harvsters,并且找到所有需要进行读取的数据源。如果input type配置的是log类型,Prospector将会去配置度路径下查找所有能匹配上的文件,然后为每一个文件创建一个Harvster。每个Prospector都运行在自己的Go routine里

1.2工作流程
当你开启filebeat程序的时候,它会启动一个或多个探测器(prospectors)去检测你指定的日志目录或文件,对于探测器找出的每一个日志文件,filebeat启动收割进程(harvester),每一个收割进程读取一个日志文件的新内容,并发送这些新的日志数据到处理程序(spooler),处理程序会集合这些事件,最后filebeat会发送集合的数据到你指定的地点
技术分享图片

1.3、具体的相关配置

[[email protected] ~]# vim /etc/filebeat/filebeat.yml
#=========================== Filebeat inputs =============================

filebeat.inputs:

# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.

- type: log

  # Change to true to enable this input configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /opt/access.log
#================================ Outputs =====================================
# Configure what output to use when sending the data collected by the beat.
output.redis:
  hosts: ["172.20.67.50:6379"]
  #port: 6379
  #password: "123456"  
  db: 2
  timeout: 10
  key: "nginx-log"

    #####备注:目前使用filebeat向redis写日志的时候不能向redis集群里写,会提示报错,所有redis只能写到单台里,
[email protected] ~]# systemctl start filebeat
[[email protected] ~]# systemctl status filebeat
● filebeat.service - Filebeat sends log files to Logstash or directly to Elasticsearch.
   Loaded: loaded (/usr/lib/systemd/system/filebeat.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2018-09-20 19:48:36 CST; 3s ago
     Docs: https://www.elastic.co/products/beats/filebeat
 Main PID: 11947 (filebeat)
   CGroup: /system.slice/filebeat.service
           └─11947 /usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat

Sep 20 19:48:36 localhost.localdomain systemd[1]: Started Filebeat sends log files to Logstash or directly to Elasticsearch..
Sep 20 19:48:36 localhost.localdomain systemd[1]: Starting Filebeat sends log files to Logstash or directly to Elasticsearch....
[[email protected] ~]# 

2、Redis具体的操作
在redis上查看具体导入的数据
技术分享图片

3、logstash 具体的配置

[[email protected] ~]# vim /usr/local/logstash/data/redis.conf 
input {
        redis {
                host => "172.20.67.50"
                port => "6379"
                data_type => "list"
                db => 2
                batch_count => 1     ###这个值是指从队列中读取数据时,一次性取出多少条。不写会报错,解决办法就是,不使用这个功能,将batch_size设置为1
                #type => "log"
                key => "nginx-log"
        }
}

filter {
          grok {
      match => { "message" => "%{IPORHOST:remote_addr} - - [%{HTTPDATE:time_local}] "%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{INT:status} %{INT:body_bytes_sent} %{QS:http_referer} %{QS:http_user_agent}"
                                }
                     }
 }

output {  
        elasticsearch {  
                hosts => "172.20.67.50:9200"
                index => "nginx-access-%{+YYYY.MM.dd}"
                }   
} 

4、查看ES集群是否有数据
可t通过head进行查看是否有数据。

5、在kibana中创建索引,即可在主页查看相关的数据了。

以上是关于记Filebeat系统资源使用优化的主要内容,如果未能解决你的问题,请参考以下文章

ELK+Filebeat+Kafka+Zookeeper构建大数据日志分析平台三

日志实时收集之FileBeat+Kafka

Filebeat +Redis+ELK处理Nginx日志系统

使用filebeat替换logstash

请问大佬有CCleaner(电脑系统优化工具) V5.82.8950 中文版软件免费百度云资源吗

总结filebeat进程写满磁盘的情况处理