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测试。
Logstash为什么那么慢?—— json序列化的更多相关文章
- .Net深入实战系列—JSON序列化那点事儿
序 当前主流的序列化JSON字符串主要有两种方式:JavaScriptSerializer及Json.net(Nuget标识:Newtonsoft.Json).JavaScriptSerializer ...
- Newtonsoft.Json 序列化和反序列化 时间格式【转】
1.JSON序列化 string JsonStr= JsonConvert.SerializeObject(Entity); eg: A a=new A(); a.Name="Elain ...
- [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类
[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能 ...
- DotNet的JSON序列化与反序列化
JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...
- C#中JSON序列化和反序列化
有一段时间没有到博客园写技术博客了,不过每天逛逛博客园中大牛的博客还是有的,学无止境…… 最近在写些调用他人接口的程序,用到了大量的JSON.XML序列化和反序列化,今天就来总结下json的序列化和反 ...
- 使用JSON.Net(Newtonsoft.Json)作为ASP.Net MVC的json序列化和反序列化工具
ASP.Net MVC默认的JSON序列化使用的是微软自己的JavaScriptSerializer.性能低不说,最让人受不了的是Dictionary<,>和Hashtable类型居然对应 ...
- Windows Phone 六、JSON序列化
JSON序列化 public class Person { public int Id { get; set; } public string Name { get; set; } public in ...
- [MVC_Json序列化]MVC之Json序列化循环引用
在做MVC项目时,难免会遇到Json序列化循环引用的问题,大致错误如下 错误1:序列化类型为“...”的对象时检测到循环引用. 错误2:Self referencing loop detected f ...
- NetworkComms V3 使用Json序列化器进行网络通信
刚才在网上闲逛,偶然看到一篇文章 C#(服务器)与Java(客户端)通过Socket传递对象 网址是:http://www.cnblogs.com/iyangyuan/archive/2012/12/ ...
随机推荐
- CentOS 7下设置DNS服务器
在CentOS 7下,手工设置 /etc/resolv.conf 里的DNS,过了一会,发现被系统重新覆盖或者清除了.和CentOS 6下的设置DNS方法不同,有几种方式: 1.使用全新的命令行工具 ...
- Win7 64位 VS2013环境编译Lua5.3.1
主要参考这篇文章,原文有几个错误顺便改正了. 在Windows下使用Visual Studio编译Lua5.3 写本文时Lua官方网站放出的新版本为5.3.1,然后我不知道为啥,神奇的国内不能访问Lu ...
- Spring 学习笔记 8. 尚硅谷_佟刚_Spring_使用外部属性文件
1,配置数据源 (1)添加驱动 (2)编写spring配置文件 <bean id="dataSource" class="org.springframework.j ...
- 关于MFC文本框输入内容的获取 与 设置文本框的内容
八月要开始做界面了<( ̄︶ ̄)/,然而目前只会用MFC╮(╯▽╰)╭ 好吧,言归正传,设置好文本框后,要获取用户输入的内容,可以用: GetDlgItemText() ; 这个函数有两个参数,第 ...
- vb- ----之常用函数
[VB]常用函数 2007-10-25 10:52 3375人阅读 评论(1) 收藏 举报 vbstringdateintegervbscriptwindows (一)类型转换类函数1. CType( ...
- oracl 创建用户
-- Create the user create user ADMIN default tablespace SYSTEM temporary tablespace TEMP profile ...
- 今天自己解决了两个问题(IE10 type slow ChromeDriver erro)
都是通过google解决的,其实本应该很快解决,可是因自己粗心,大写小错了,加上java基础不过关, "webdriver.chrome.driver"中的webdriver应是全 ...
- 在Windows用Rebar来构建,编译,测试,发布Erlang项目
rebar是一个遵循 Erlang/OTP 原则的 Erlang 项目构建工具,使用它可以减少构建标准 Erlang/OTP 项目架构配置的工作量,并且可以很容易的编译.测试.发布 Erlang 应用 ...
- Inno Setup 如何读写文件
软件安装的实质就是拷贝,对于简单的打包当然不需要考虑修改某(配置)文件.通过inno修改文件的目的在于把安装时相关信息写入文件中,提供其它应用的读取,而这些信息也只能在安装时才能确定,比如安装用户选择 ...
- MyEclipse 自带的TomCat 新增部署的时候不显示 Deploy Location
项目总是报错,添了删,删了又添了N次以后,发现添加部署的时候,Deploy Location 没有值了,Deploy Location 没有值在自带的Tomcat上就无法用浏览器浏览(Open in ...