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

作者 | 少旋
来源 | 阿里技术公众号

一 前言

前段时间, iLogtail [1]阿里千万实例可观测采集器开源,其中介绍了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 下的标准输出流采集性能。
  • 实验6:iLogtail 在 5M/s、10M/s、10M/s、40M/s 下的容器内文件采集性能。

三 试验环境

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

1 环境

运行环境:阿里云ACK Pro 版本
节点配置:ecs.g6.xlarge (4 vCPU 16GB) 磁盘ESSD
底层容器:Containerd
iLogtail版本:1.0.28
FileBeat版本:v7.16.2

2 数据源

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

apiVersion: batch/v1
kind: Job
metadata:name: nginx-log-demo-0namespace: default
spec:template:metadata:name: nginx-log-demo-0spec:restartPolicy: Nevercontainers:- name: nginx-log-demo-0image: registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latestcommand: ["/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: pathmountPath: /var/log/medlinkersubPath: nginx-log-demo-0resources:limits:memory: 200Mirequests:cpu: 10mmemory: 10Mivolumes:- name: pathhostPath:path: /testlogtype: DirectoryOrCreatenodeSelector:kubernetes.io/hostname: cn-beijing.192.168.0.140

3 Filebeat 标准输出流采集配置

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

  filebeat.yml: |-filebeat.registry.flush: 30sprocessors:- add_kubernetes_metadata:host: ${NODE_NAME}matchers:- logs_path:logs_path: "/var/log/containers/"- drop_event:when:equals:input.type: containeroutput.console:pretty: falsequeue:mem:events: 4096flush.min_events: 2048flush.timeout: 1smax_procs: 4filebeat.inputs:- type: containerharvester_buffer_size: 524288paths:- /var/log/containers/nginx-log-demo-0-*.log

4 Filebeat 容器文件采集配置

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

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

  filebeat.yml: |-filebeat.registry.flush: 30soutput.console:pretty: falsequeue:mem:events: 4096flush.min_events: 2048flush.timeout: 1smax_procs: 4filebeat.inputs:- type: logharvester_buffer_size: 524288paths:- /testlog/nginx-log-demo-0/*.logprocessors:- drop_event:when:equals:log.file.path: /testlog/nginx-log-demo-0/access.log

5 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"}}}]
}

6 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 的对比项主要包含以下内容:标准输出流采集性能、容器内文件采集性能、标准输出流多用户配置性能、容器内文件多用户配置性能以及大流量采集性能。

1 标准输出流采集性能对比

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

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

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

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

2 容器内文件采集性能对比

输入数据源: 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的百分比为单核的百分比):

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

3 采集配置膨胀性能对比

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

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

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

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

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

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

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

4 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机制。

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

5 对比总结

五 为什么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倍性能。

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

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

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

七 结语

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

参考文献

  • Logtail技术分享一
  • Logtail技术分享二
  • Filebeat 配置
  • Filebeat 容器化部署
  • iLogtail 使用指南

原文链接

本文为阿里云原创内容,未经允许不得转载。

iLogtail 与Filebeat 性能对比相关推荐

  1. Java常用消息队列原理介绍及性能对比

    消息队列使用场景 为什么会需要消息队列(MQ)? 解耦  在项目启动之初来预测将来项目会碰到什么需求,是极其困难的.消息系统在处理过程中间插入了一个隐含的.基于数据的接口层,两边的处理过程都要实现这一 ...

  2. golang连接postgresql too many client_MySQL和PostgreSQL压测性能对比

    阅读使人充实,讨论使人敏捷,写作使人精确. >>> 压测业务场景文章属于互联网社区动态类场景核心功能压测案例.至于题目涉及的MySQL和PostgreSQL之间的关系,主要为业务选型 ...

  3. php下curl与file_get_contents性能对比

    为什么80%的码农都做不了架构师?>>>    上一篇讲了 <php使用curl替代file_get_contents>, 后续贴出了curl和file_get_cont ...

  4. p40与p100训练性能对比

    深度学习训练,选择P100就对了 原文:https://yq.aliyun.com/articles/238764 摘要: 本文使用NVCaffe.MXNet.TensorFlow三个主流开源深度学习 ...

  5. php vs lua,解析LUA与PHP在WEB应用的性能对比

    解析LUA与PHP在WEB应用的性能对比是本文要介绍的内容,这几天用在WEB开发的LUA框架已经完成,框架中已包括数据库操作和模板操作的功能,能够很简单方便的应用在WEB开发上.在此时我对这个LUA框 ...

  6. Jetson Nano and VIM3硬件参数对比及目标检测性能对比

    文章目录: 1 Jetson Nano and VIM3硬件参数对比及目标检测性能对比 2 Jetson nano在yolov4目标检测性能 3 VIM在yolov3.yolov3-tiny.yolo ...

  7. MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比

    1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.不 ...

  8. cimage和gdi绘图效率比较_GDI+和GDI绘图性能对比实验

    龙源期刊网 http://www.qikan.com.cn GDI+ 和 GDI 绘图性能对比实验 作者:王克茹 来源:<科技创新与应用> 2013 年第 25 期 摘 要:本文通过完全相 ...

  9. 五款主流 Linux 发行版性能对比,稳而不强?

    测试结果解读 2018 即将结束,年末正是各种基准测试对比轮番出炉的时候,通过这些报告,我们可以看到 Linux 性能的各个方面在 2018 是如何发展的.但本文的这份性能对比会更加深入 -- 将研究 ...

最新文章

  1. tensorflow的axis理解
  2. 【干货】105页周志华教授《机器学习手推公式》开源PDF
  3. android 手机投影演示 ——vysor操作手册
  4. 为什么手机上传图片这么慢 前端_为什么手机拿去维修,店家总说第二天来取?修手机真这么慢?...
  5. Redirecting to binsystemctl start crond.service
  6. Android Json解析与总结
  7. 将EntityManager.refresh添加到所有Spring数据存储库
  8. 【转】Windows Server 2012 R2 双网卡绑定
  9. XStream 解析 XML 深入剖析
  10. 微软IE浏览器1月市场份额再创新低 跌至67.6%
  11. ModelSim ALTERA 6.5b 下载安装以及使用
  12. pyserial库是python语言用于,python的pyserial模块
  13. u盘作为重要的计算机存储介质,U盘是采用FLASH MEMORY作为存储介质的移动存储设备...
  14. [经典之作]vml经典之作
  15. Unity --- 角色动画的使用以及按键控制角色运动
  16. 全球及中国组织工程医疗产品行业深度分析及十四五前景预测报告2022年版
  17. 国内常见的一些代码托管平台
  18. OpenShift介绍及应用
  19. docker下安装mysql_Docker下安装MySQL
  20. Ubuntu20.04下没有亮度调节且找不到/sys/class/backlight文件夹(backlight里为空)的解决办法

热门文章

  1. JAVA入门级教学之(变量)
  2. 上海电力学院计算机技术,上海电力学院计算机与信息工程学院介绍
  3. python 排列组合_python 编写排列组合
  4. rfid阅读器的主要任务_RFID阅读器(读写器)的应用领域及其如何使用?
  5. php 递归格式化数组,利用php递归实现无限分类 格式化数组的详解
  6. 聘用计算机高级职称,关于咨询高级职称聘用的问题
  7. 2017电大c语言考试时间,2017年电大 《c语言程序设计》a课程考核说明.doc
  8. linux 删除含有关键词的文件_linux下查找包含关键字的文件
  9. 红旗linux安装oracle,Redflag Linux安装Oracle 10gR2 RAC记事
  10. 知名教授:希望论文一作发Nature后去当公务员的那名学生能看到我的这篇文章...