Logstash为什么那么慢?—— json序列化
今天跟
峡谷金桥
聊天,询问起Logstash的性能,金桥提示说Logstash中json的序列化是浪费性能的一方面。于是便有了下面的测试:
第一步,造数据
首先需要造一份数据,数据可以通过logstash的generator来造。
input{
generator{}
}
output{
file{
path => "E:/test.log"
}
}
生成的数据格式如下:
{"message":"Hello world!","@version":"1","@timestamp":"2016-07-12T13:46:48.821Z","host":"DESKTOP-1GPAD95","sequence":0}
{"message":"Hello world!","@version":"1","@timestamp":"2016-07-12T13:46:48.824Z","host":"DESKTOP-1GPAD95","sequence":1}
{"message":"Hello world!","@version":"1","@timestamp":"2016-07-12T13:46:48.824Z","host":"DESKTOP-1GPAD95","sequence":2}
{"message":"Hello world!","@version":"1","@timestamp":"2016-07-12T13:46:48.825Z","host":"DESKTOP-1GPAD95","sequence":3}
...
第二步,编写测试脚本
测试的思路是,从test.log文件中读取数据。然后计算一定范围内写入的日志数量(靠人工计算啦!)
codec => json
的测试的脚本如下:
input{
file{
path => "E:/test.log"
codec => json
start_position => "beginning"
}
}
filter{
ruby {
code => "event['tag'] = Time.now"
}
}
output{
file{
path => "E:/json_result3.log"
}
}
codec => plain
的测试的脚本如下:
input{
file{
path => "E:/test.log"
codec => plain
start_position => "beginning"
}
}
filter{
ruby {
code => "event['tag'] = Time.now"
}
}
output{
file{
path => "E:/json_result3.log"
}
}
第三步,计算每10S中产生的日志数量
这里在每条事件中写入了1个时间戳字段,然后打开文件,定位随机定位一个开始的秒数,比如从2016-07-12 22:12:44
到2016-07-12 22:12:54
这十秒钟,产生的日志数量就是解析的数量。
为了避免机器差异以及运行环境的差异,所带来的误差,这里每个codec执行了3次,计算得出的数据大致如下:
日志名称 | 起始时间(行数) | 结束时间(行数) | 总行数(结束-起始) |
---|---|---|---|
json_result1.log | 2016-07-12 22:12:44(63) | 2016-07-12 22:12:54(34728) | 34665 |
json_result2.log | 2016-07-12 22:26:18(517) | 2016-07-12 22:26:28(27599) | 27082 |
json_result3.log | 2016-07-12 22:27:48(147) | 2016-07-12 22:27:58(30352) | 30205 |
plain_result1.log | 2016-07-12 22:13:41(300) | 2016-07-12 22:13:51(50437) | 50137 |
plain_result2.log | 2016-07-12 22:22:32(187) | 2016-07-12 22:22:42(53525) | 53338 |
plain_result3.log | 2016-07-12 22:24:43(360) | 2016-07-12 22:24:53(43580) | 43220 |
测试结果也可以参考下面的图片,更为直观一点:
最后说明
从测试的结果来看,的确plan要比json性能高一些,也就是说logstash在做json序列化的时候浪费了很多的性能。
这就给想要自己写数据采集框架的朋友一点提示——Event对象该如何设计?
PS:由于我选取的数据样本范围都是第一个完整的10秒钟,因此可以看到采集的数据量比较少,平均每秒还不到1w.
这可能受多方条件影响:
- 1 我是读文件--写文件,对于磁盘IO可能有一定的影响
- 2 我选取的都是开始的10秒钟数据,可能刚开始数据采集还没有稳定~ 如果有时间的朋友,可以采集个1分钟左右,从最后的10s测试。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2015-07-12 《社会化营销:人人参与的营销力量》—— 读后总结