iLogtail 与Filebeat 性能对比

简介: 前段时间, iLogtail (https://github.com/alibaba/ilogtail)阿里千万实例可观测采集器开源,其中介绍了iLogtail采集性能可以达到单核100MB/s,相比开源采集Agent有5-10倍性能优势。很多小伙伴好奇iLogtail具体的性能数据和资源消耗如何,本文将针对目前业界使用度较高且性能相对较优的Agent FileBeat进行对比,测试这两个Agent在不同压力场景下的表现如何。

测试试验描述

随着Kubernetes 普及,Kubernetes 下的日志收集的需求也日益常态化,因此下文将分别进行容器标准输出流采集与容器内静态文件采集对比试验(使用静态文件采集的小伙伴可以参考容器内静态文件采集对比试验, iLogtail 纯静态文件采集会略优于试验2容器内文件静态采集),试验项具体如下:

  • 实验1:恒定采集配置4,Filebeat & iLogtail 在原始日志产生速率 1M/s、2M/s、 3M/s 下的标准输出流采集性能对比。
  • 实验2:恒定采集配置4,Filebeat & iLogtail 在原始日志产生速率 1M/s、2M/s、 3M/s 下的容器内文件采集性能对比。

而在真实的生产环境中,日志采集组件的可运维性也至关重要,为运维与后期升级便利,相比于Sidecar模式,K8s下采用Daemonset模式部署采集组件更加常见。但由于Daemonset 同时将整个集群的采集配置下发到各个采集节点的特性,单个采集节点正在工作的配置必定小于全量采集配置数目,因此我们还会进行以下2部分试验,验证采集配置的膨胀是否会影响采集器的工作效率:

  • 实验3:恒定输入速率3M/s,Filebeat & iLogtail 在采集配置50、100、500、1000 份下的标准输出流采集性能对比。
  • 实验4:恒定输入速率3M/s,Filebeat & iLogtail 在采集配置50、100、500、1000 份下的容器内文件采集性能对比。

最后会进行iLogtail 的大流量压测,具体如下:

  • 实验5:iLogtail 在 5M/s、10M/s、10M/s、40M/s 下的标准输出流采集性能。
  • 实验5:iLogtail 在 5M/s、10M/s、10M/s、40M/s 下的容器内文件采集性能。

试验环境

所有采集环境数据存储于https://github.com/EvanLjp/ilogtail-comparison, 感兴趣的同学可以自己动手进行整个对比测试实验, 以下部分分别描述了不同采集模式的具体配置,如果只关心采集对比结果,可以直接跳过此部分继续阅读。

环境

运行环境:阿里云ACK Pro 版本

节点配置:ecs.g6.xlarge (4 vCPU 16GB) 磁盘ESSD

底层容器:Containerd

iLogtail版本:1.0.28

FileBeat版本:v7.16.2

数据源

对于数据源,我们首先去除因正则解析或多行拼接能力带来的差异,仅仅以最基本的单行采集进行对比,数据产生源模拟产生nginx访问日志,单条日志大小为283B,以下配置描述了1000条/s 速率下的输入源:

apiVersion: batch/v1

kind: Job

metadata:

 name: nginx-log-demo-0

 namespace: default

spec:

 template:

   metadata:

     name: nginx-log-demo-0

   spec:

     restartPolicy: Never

     containers:

       - name: nginx-log-demo-0

         image: registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest

         command: ["/bin/mock_log"]

         args:  ["--log-type=nginx",  "--path=/var/log/medlinker/access.log", "--total-count=1000000000", "--log-file-size=1000000000", "--log-file-count=2", "--logs-per-sec=1000"]

         volumeMounts:

           - name: path

             mountPath: /var/log/medlinker

             subPath: nginx-log-demo-0

         resources:

           limits:

             memory: 200Mi

           requests:

             cpu: 10m

             memory: 10Mi

     volumes:

     - name: path

       hostPath:

         path: /testlog

         type: DirectoryOrCreate

     nodeSelector:

       kubernetes.io/hostname: cn-beijing.192.168.0.140

Filebeat 标准输出流采集配置

Filebeat 原生支持容器文件采集,通过add_kubernetes_metadata组件增加kubernetes 元信息,为避免输出组件导致的性能差异,通过drop_event插件丢弃数据,避免输出,filebeat测试配置如下(harvester_buffer_size 调整设置为512K,filebeat.registry.flush: 30squeue.mem 参数适当扩大,增加吞吐):

 filebeat.yml: |-

   filebeat.registry.flush: 30s

   processors:

     - add_kubernetes_metadata:

         host: ${NODE_NAME}

         matchers:

         - logs_path:

             logs_path: "/var/log/containers/"

     - drop_event:

         when:

           equals:

             input.type: container

   output.console:

     pretty: false

   queue:

     mem:

       events: 4096

       flush.min_events: 2048

       flush.timeout: 1s

   max_procs: 4

   filebeat.inputs:

   - type: container

     harvester_buffer_size: 524288

     paths:

       - /var/log/containers/nginx-log-demo-0-*.log

Filebeat 容器文件采集配置

Filebeat 原生不支持容器内文件采集,因此需要人工将日志打印路径挂载于宿主机HostPath,这里我们使用  subPath以及DirectoryOrCreate功能进行服务打印路径的分离, 以下为模拟不同服务日志打印路径独立情况。

filebeat 使用基础日志读取功能读取/testlog路径下的日志,为避免输出组件导致的性能差异,通过drop_event插件丢弃数据,避免输出,测试配置如下(harvester_buffer_size 调整设置为512K,filebeat.registry.flush: 30squeue.mem 参数适当扩大,增加吞吐):

 filebeat.yml: |-

   filebeat.registry.flush: 30s

   output.console:

     pretty: false

   queue:

     mem:

       events: 4096

       flush.min_events: 2048

       flush.timeout: 1s

   max_procs: 4

   

   filebeat.inputs:

   - type: log

     harvester_buffer_size: 524288

     paths:

       - /testlog/nginx-log-demo-0/*.log

     processors:

       - drop_event:

           when:

             equals:

               log.file.path: /testlog/nginx-log-demo-0/access.log

iLogtail 标准输出流采集配置

iLogtail 原生同样支持标准输出流采集,service_docker_stdout 组件已经会提取kubernetes 元信息,为避免输出组件导致的性能差异,通过processor_filter_regex,进行所有日志的过滤,测试配置如下:

{

   "inputs":[

       {

           "detail":{

               "ExcludeLabel":{


               },

               "IncludeLabel":{

                   "io.kubernetes.container.name":"nginx-log-demo-0"

               }

           },

           "type":"service_docker_stdout"

       }

   ],

   "processors":[

       {

           "type":"processor_filter_regex",

           "detail":{

               "Exclude":{

                   "_namespace_":"default"

               }

           }

       }

   ]

}

iLogtail 容器文件采集配置

iLogtail 原生支持容器内文件采集,但由于文件内采集元信息存在于tag标签,暂无过滤插件,为避免输出组件导致的性能差异,因此我们使用空输出插件进行输出,测试配置如下:

{

   "metrics":{

       "c0":{

           "advanced":{

               "k8s":{

                   "IncludeLabel":{

                       "io.kubernetes.container.name":"nginx-log-demo-0"

                   }

               }

           },

          ......

           "plugin":{

               "processors":[

                   {

                       "type":"processor_default"

                   }

               ],

               "flushers":[

                   {

                       "type":"flusher_statistics",

                       "detail":{

                           "RateIntervalMs":1000000

                       }

                   }

               ]

           },

           "local_storage":true,

           "log_begin_reg":".*",

           "log_path":"/var/log/medlinker",

           ......

       }

   }

}

Filebeat与iLogtail对比测试

Filebeat 与 iLogtail 的对比项主要包含以下内容:标准输出流采集性能、容器内文件采集性能、标准输出流多用户配置性能、容器内文件多用户配置性能以及大流量采集性能。

标准输出流采集性能对比

输入数据源: 283B/s, 底层容器contianerd,标准输出流膨胀后为328B, 共4个输入源:

  • 1M/s 输入日志3700条/s,
  • 2M/s 输入日志7400条/s,
  • 3M/s 输入日志条11100条/s。

以下显示了标准输出流不同采集的性能对比,可以看到iLogtail相比于Filebeat 有十倍级的性能优势(CPU的百分比为单核的百分比):

FIlebeat

ILogtail

1M/s

20%

2%

2M/s

37%

3.3%

3M/s

52%

4.1%

以下显示了标准输出流不同采集的内存对比,可以看到logtail 和filebeat 整体内存相差不大,没有出现随采集流量上升内存暴涨情况:

FIlebeat

ILogtail

1M/s

136M

90M

2M/s

134M

90M

3M/s

144M

90M

容器内文件采集性能对比

输入数据源: 283B/s,  共4个输入源:

  • 1M/s 输入日志3700条/s,
  • 2M/s 输入日志7400条/s,
  • 3M/s 输入日志条11100条/s。


以下显示了容器内文件不同采集的性能对比,Filebeat 容器内文件由于与container 采集共用采集组件,并省略了Kubernets meta 相关组件,所以相比于标准输出流采集有大性能提升,iLogtail 的容器内文件采集采用Polling + inotify机制,同样相比于容器标准输出流采集有性能提升, 但可以看到iLogtail相比于Filebeat 有5倍级的性能优势(CPU的百分比为单核的百分比):

FIlebeat

ILogtail

1M/s

5%

1.3%

2M/s

11%

2%

3M/s

15%

3%

以下显示了标准输出流不同采集的内存对比,可以看到logtail 和filebeat 整体内存相差不大,没有出现随采集流量上升内存暴涨情况:

FIlebeat

ILogtail

1M/s

136M

126M

2M/s

140M

141M

3M/s

141M

142M


采集配置膨胀性能对比

采集配置膨胀性能对比,输入源设置为4,总输入速率为3M/s, 分别进行50采集配置,100采集配置,500采集配置,1000采集配置 对比。

标准输出流采集配置膨胀对比

以下显示了标准输出流不同采集的性能对比,可以看到Filebeat 由于容器采集与静态文件采集底层共用相同静态文件采集逻辑,会在标准输出流采集路径var/log/containers下存在大量正则匹配的工作,可以看到虽然采集数据量没有增加由于采集配置的增加,CPU消耗增加10%+,而iLogtail 针对容器采集模型全局共享容器路径发现机制,所以避免了正则逻辑带来的性能损耗(CPU的百分比为单核的百分比)。

采集配置

FIlebeat

ILogtail

50

65%

5%

100

68%

6.30%

500

75%

7%

1000

82%

8.70%

在内存膨胀方面,可以看到不论是Filebeat 还是iLogtail 都存在由于采集配置增加导致的内存膨胀,但2者的膨胀大小都处于可接受范围。

采集配置

FIlebeat

ILogtail

50

148M

95M

100

149M

98M

500

163M

115M

1000

177M

149M


容器内文件采集配置膨胀对比

以下显示了容器内文件采集不同采集器的性能对比,可以看到Filebeat 静态文件采集由于避免标准输出流通用路径正则,相较于标准增加CPU消耗较少,而iLogtail CPU 变化同样很小,且相比于标准输出流采集性能略好(CPU的百分比为单核的百分比)。

采集配置

FIlebeat

ILogtail

50

16%

4.30%

100

16.30%

4.30%

500

20.00%

5.60%

1000

22%

7.30%

在内存膨胀方面,同样可以看到不论是Filebeat 还是iLogtail 都存在由于采集配置增加导致的内存膨胀,但2者的膨胀大小都处于可接受范围。

采集配置

FIlebeat

ILogtail

50

142M

99M

100

145M

104M

500

164M

128M

1000

183M

155M


iLogtail 采集性能测试

由于FileBeat在日志量大的场景下出现采集延迟问题,所以以下场景仅针对iLogtail进行测试,分别在5M/s、10M/s、20M/s 下针对iLogtail 进行容器标准输出流采集与容器内文件采集的性能压测。

  • 输入源数量:10
  • 单条日志大小283B
  • 5M/s  对应日志速率 18526条/s,单输入源产生速率1852条/s
  • 10M/s  对应日志速率 37052条/s,单输入源产生速率3705条/s
  • 20M/s  对应日志速率 74104条/s,单输入源产生速率7410条/s
  • 40M/s  对应日志速率 148208条/s,单输入源产生速率14820条/s

和上述试验类似可以看到CPU消耗方面容器文件采集略好于容器标准输出流采集性能(CPU的百分比为单核的百分比),主要是由于容器文件采集底层Polling + inotify机制,感兴趣的同学可以阅读Logtail技术分享一了解更多内容。

速率

容器文件采集

标准输出流采集

5M/s

5.70%

4.70%

10M/s

10.00%

10.30%

20M/s

15.00%

18.70%

40M/s

22%

36%

在内存方面,由于标准输出流采集主要依赖于GO,而容器文件采集主要依赖于C,可以由于GC机制的存在,随着速率的上升,标准输出流采集消耗的内存会逐渐超过容器内文件采集消耗的内存。

速率

容器文件采集

标准输出流采集

5M/s

148M

100M

10M/s

146M

130M

20M/s

147M

171M

40M/s

150M

220M


对比总结

CPU 对比结论

内存对比结论

容器标准输出流采集性能

同流量输入下,iLogtail 相较于Filebeat 十倍级别性能

iLogtail 与Filebeat 内存消耗差异不大。

容器文件采集采集性能

同流量输入下,iLogtail 相较于Filebeat 5倍级别性能

iLogtail 与Filebeat 内存消耗差异不大。

容器标准输出流采集多配置性能

同流量输入下,随着采集配置增加,Filebeat CPU 增加量为iLogtail CPU增加量的3倍。

iLogtail 与Filebeat 都会因采集配置增加产生内存膨胀,都处于可接受范围。

容器文件采集多配置性能

同流量输入下,随着采集配置增加,Filebeat CPU 增加量为iLogtail CPU增加量的2倍。

iLogtail 与Filebeat 都会因采集配置增加产生内存膨胀,都处于可接受范围。

为什么Filebeat 容器标准输出与文件采集差异巨大?

通过上述试验可以看到FIlebeat 在不同工作模式下有较大的CPU差异,通过dump 容器标准输出流采集的pprof 可以得到如下火焰图,可以看到Filebeat 容器采集下的add_kubernets_meta 插件是性能瓶颈,同时FIlebeat 的add_kubernets_meta 采用与每个节点监听api-server 模式,也存在api-server 压力问题。

而iLogtail 取kubernetes meta 完全是兼容kubernetes CRI 协议,直接通过kubernets sandbox 进行meta 数据读取,保证了iLogtail 的高性能采集效率。

iLogtail DaemonSet 场景优化

通过以上对比,可以看到iLogtail 相比于Filebeat 具有了优秀的内存以及CPU 消耗,有小伙伴可能好奇iLogtail 拥有如此极致性能背后原因,下文主要讲解iLogtail Daemonset 场景下的优化,如何标准输出流相比于FIlebeat 拥有10倍性能,其他具体优化措施请参考:Logtail技术分享一与 Logtail技术分享二

首先对于标准输出流场景,相比于其他开源采集器,例如Filebeat 或Fluentd。一般都是通过监听var/log/containers/var/log/pods/ 实现容器标准输出流文件的采集,比如/var/log/pods/ 的路径结构为: /var/log/pods/__//, 通过此路径复用物理机静态文件采集模式进行采集。

而对于iLogtail,做到了容器化的全支持,iLogtail 通过发现机制,全局维护对Node 节点容器的列表,并实时监听与维护此容器列表。当我们拥有容器列表后,我们便具有了如下优势:

  • 采集路径不在依赖于静态配置路径,可以靠容器标签动态选择采集源,从而简化用户接入成本。
  • 可以根据容器元信息探测容器自动挂载节点的动态路径,所以iLogtail 无需挂载即可采集容器内文件,而如Filebeat 等采集器需要将容器内路径挂载于宿主机路径,再进行静态文件采集。
  • 对于新接入采集配置复用历史容器列表,快速接入采集,而对于空采集配置,由于容器发现全局共享机制的存在,也就避免了存在空轮训监听路径机制的情况,进而保证了在容器这样动态性极高的环境中,iLogtail 可运维性的成本达到可控态。

结语

综上所述,在动态性极高的Kubernetes 环境下,iLogtail不会因为采用Daemonset 的部署模型带来的多配置问题,造成内存大幅度膨胀,而且在静态文件采集方面,iLogtail 拥有5倍左右的性能优势,而对于标准输出流采集,由于iLogtail 的采集机制,iLogtail 拥有约10倍左右的性能优势。但是相比于Filebeat 或Fluentd 等老牌开源产品,在文档建设与社区建设上还欠缺很多,欢迎对iLogtail 感兴趣的小伙伴一起参与进来,共同打造易用且高性能的iLogtail 产品。

image.png

参考文献

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
消息中间件 数据采集 JSON
iLogtail社区版使用入门 - iLogtail日志处理实战
本文将会详细介绍使用iLogtail社区版进行日志采集时,对于常见日志格式的处理实战。为了便于调测,以下样例默认将采集到的日志,经过处理后,输出到标准输出,开发者可以根据实际需求进行适当的调整。
4112 0
|
9月前
|
SQL 存储 监控
SLS 物化视图来了:大规模日志查询提速 100 倍,资源消耗直降 90%
阿里云日志服务推出物化视图,通过智能预计算 + 自动查询改写,实现监控看板秒级响应、资源开销大幅降低,彻底解决‘查得慢、扛不住、不准’三大难题。
547 69
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
1462 8
|
消息中间件 存储 JSON
日志采集 Agent 性能大比拼——LoongCollector 性能深度测评
为了展现 LoongCollector 的卓越性能,本文通过纵向(LoongCollector 与 iLogtail 产品升级对比)和横向(LoongCollector 与其他开源日志采集 Agent 对比)两方面对比,深度测评不同采集 Agent 在常见的日志采集场景下的性能。
1168 34
|
机器学习/深度学习 人工智能 自然语言处理
通古大模型:古籍研究者狂喜!华南理工开源文言文GPT:AI自动断句+写诗翻译,24亿语料喂出来的学术神器
通古大模型由华南理工大学开发,专注于古籍文言文处理,具备强大的古文句读、文白翻译和诗词创作功能。
3409 11
通古大模型:古籍研究者狂喜!华南理工开源文言文GPT:AI自动断句+写诗翻译,24亿语料喂出来的学术神器
|
中间件 Linux vr&ar
Centos7升级Glibc
centos7升级glic问题
4154 0
|
存储 消息中间件 监控
Redis Stream:实时数据流的处理与存储
通过上述分析和具体操作示例,您可以更好地理解和应用 Redis Stream,满足各种实时数据处理需求。
1536 14
|
存储 Linux 持续交付
史上最全 Terraform 入门教程,助你无坑入门!
【10月更文挑战第26天】这是一个全面的 Terraform 入门教程,涵盖了 Terraform 的基本概念、安装步骤、基础配置、变量和输出变量的使用、模块的定义与使用,以及状态管理。通过实例讲解如何创建本地文件资源和 AWS S3 桶,帮助初学者快速上手并掌握 Terraform 的核心功能。
4650 8
|
运维 安全 虚拟化