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测试。
- 开始使用Linux
- .Net魔法堂:开启IIS的WebGarden、WebFarm和StateServer之旅
- java中的tuple实现
- MYSQL5.7开启慢查询日志
- 微信又是一次大更新,下拉多任务切换 各种有趣小游戏
- 人工智能有可能超越人类大脑?
- 一种简单的数据库性能测试方法
- xiaomao.com7位数高价成交,并已启用建站
- Docker基于已有的镜像制新的镜像-Docker for Web Developers(3)
- 如何通过Remoting实现双向通信
- jenkins 入门教程(上)
- 让jQuery Tools Scrollable控件在Mobile Web里面支持resize功能
- CentOS6.5上golang环境配置
- 马斯克频发推文,或在揭示特斯拉明年大动作?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 机器学习与情绪交易(附代码)
- 社区前端游戏框架LollipopCreator v1.0.X正式开源
- 社区开源框架音效管理模块:AudioManager详解
- 社区开源框架音效管理模块:AvatarManager详解
- vue-element-admin实现一个可编辑的table
- vue+element实现一个excel表格下载的功能
- vue的select下拉框多选项-multiple属性
- HBase基准测试
- Shell数组的使用
- 查询MYSQL锁表情况
- 查看MYSQL表数据大小
- 解决Centos6.0下出现protocol not available错误
- MYSQL删除大数据表经验总结
- 推荐4款堪比Google的搜索网站
- 那些年你走过下划线的坑