简介:前段时间, 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-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

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: 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

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: 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

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. Elasticsearch的几种架构(ELK,EL,EF)性能对比测试报告

    Elasticsearch的几种架构性能对比测试报告 1.前言 选定了Elasticsearch作为存储的数据库,但是还需要对Elasticsearch的基础架构做一定测试,所以,将研究测试报告输出如 ...

  2. [原] KVM 环境下MySQL性能对比

    KVM 环境下MySQL性能对比 标签(空格分隔): Cloud2.0 [TOC] 测试目的 对比MySQL在物理机和KVM环境下性能情况 压测标准 压测遵循单一变量原则,所有的对比都是只改变一个变量 ...

  3. 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)

    如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...

  4. Java--Stream,NIO ByteBuffer,NIO MappedByteBuffer性能对比

    目前Java中最IO有多种文件读取的方法,本文章对比Stream,NIO ByteBuffer,NIO MappedByteBuffer的性能,让我们知道到底怎么能写出性能高的文件读取代码. pack ...

  5. C正则库做DNS域名验证时的性能对比

    C正则库做DNS域名验证时的性能对比   本文对C的正则库regex和pcre在做域名验证的场景下做评测. 验证DNS域名的正则表达式为: "^[0-9a-zA-Z_-]+(\\.[0-9a ...

  6. 开发语言性能对比,C++、Java、Python、LUA、TCC

    一直想做开发语言性能对比,刚好有时间都做了给大家参考一下, 编译类:C++和Java表现还不错 脚本类:TCC脚本动态运行C语言,性能比其他脚本快好多... 想玩TCC的同学下载测试包,TCC目录下修 ...

  7. php+mysql预查询prepare 与普通查询的性能对比

    prepare可以解决大访问量的网站给数据库服务器所带来的负载和开销,本文章通过实例向大家介绍预查询prepare与普通查询的性能对比,需要的朋友可以参考一下. 实例代码如下: <?php cl ...

  8. 不同Framework下StringBuilder和String的性能对比,及不同Framework性能比(附Demo)

    本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 介绍 环境搭建 测试用例 MSDN说明 ...

  9. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)

    主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...

  10. ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...

随机推荐

  1. 怎么实现Redis的高可用?(主从、哨兵、集群)

    高可用有两个含义:一是数据尽量不丢失,二是保证服务尽可能可用. AOF 和 RDB 数据持久化保证了数据尽量不丢失,那么多节点来保证服务尽可能提供服务. 一般在实际生产中,服务不会部署成单节点,主要是 ...

  2. TCP可靠传输的保证

    我们知道传输层提供最主要的两种协议,TCP和UDP,其中TCP是保证可靠传输,为什么他要保证可靠传输呢,IP说:当然是我不能,我只提供尽力而为的服务,不保证你能不能交付,不保证能不能正确的交付,不保证 ...

  3. python高级技术(死锁、递归锁、信号量、Event事件、进程池、线程池、协程)

    一 死锁和递归锁(了解) 进程也有死锁与递归锁,使用方法类似 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 此时称 ...

  4. 阿里二面:Java中锁的分类有哪些?你能说全吗?

    引言 在多线程并发编程场景中,锁作为一种至关重要的同步工具,承担着协调多个线程对共享资源访问秩序的任务.其核心作用在于确保在特定时间段内,仅有一个线程能够对资源进行访问或修改操作,从而有效地保护数据的 ...

  5. 技嘉主板开启VT

    AM4接口主板开启虚拟化: M.I.T.->Advanced Frequency Settings->Advanced CPU Core Settings->SVM Mode (虚拟 ...

  6. AndroidStudio开发体温上报安卓APP------问题总结

    总结一下出现的问题: 1.首先是AndroidStudio的配置问题 在这里可以看sdk版本配置 这里可以看gradle的版本信息和下载目录 AndroidStudio手动配置gradle 1.首先编 ...

  7. 《梦断代码》(《Dreaming in Code》)读书笔记

    <梦断代码>(<Dreaming in Code>)读书笔记 在看了这本书之后,我在豆瓣看到一段书评:做软件难.软件乃是人类自以为最有把握,实则最难掌控的技术.这本书揭示了好多 ...

  8. DevSecOps 中的漏洞管理(上)

    DevSecOps意味着在DevOps交付管道把安全性包含进去.该模型尽可能早地将安全原则集成到软件开发生命周期的所有适用阶段中.下图展示了安全方面在DevOps后期阶段的集成,但DevSecOps安 ...

  9. 白话分解入门操作系统到 Java

    一.完成一个任务需要什么? 时间 + 资源 + 处理能力 时间就是时间. 资源就是资源. 处理能力就是能够利用时间和资源完成任务的主体. 二.关于操作系统 处理能力就是cpu. 资源就是存储. 时间就 ...

  10. #Raney引理,圆排列#洛谷 6672 [清华集训2016] 你的生命已如风中残烛

    题目 分析 转化一下条件,就是 \(\sum{w_i}\geq i\),将所有牌权值减一,那就是 \(\sum{w'_i}\geq 0\) 根据Raney引理,总和为 1 的数列,在循环移位时,只有一 ...