今天跟峡谷金桥聊天,询问起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:442016-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序列化的更多相关文章

  1. .Net深入实战系列—JSON序列化那点事儿

    序 当前主流的序列化JSON字符串主要有两种方式:JavaScriptSerializer及Json.net(Nuget标识:Newtonsoft.Json).JavaScriptSerializer ...

  2. Newtonsoft.Json 序列化和反序列化 时间格式【转】

    1.JSON序列化 string JsonStr= JsonConvert.SerializeObject(Entity); eg:   A a=new A(); a.Name="Elain ...

  3. [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类

    [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能 ...

  4. DotNet的JSON序列化与反序列化

    JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...

  5. C#中JSON序列化和反序列化

    有一段时间没有到博客园写技术博客了,不过每天逛逛博客园中大牛的博客还是有的,学无止境…… 最近在写些调用他人接口的程序,用到了大量的JSON.XML序列化和反序列化,今天就来总结下json的序列化和反 ...

  6. 使用JSON.Net(Newtonsoft.Json)作为ASP.Net MVC的json序列化和反序列化工具

    ASP.Net MVC默认的JSON序列化使用的是微软自己的JavaScriptSerializer.性能低不说,最让人受不了的是Dictionary<,>和Hashtable类型居然对应 ...

  7. Windows Phone 六、JSON序列化

    JSON序列化 public class Person { public int Id { get; set; } public string Name { get; set; } public in ...

  8. [MVC_Json序列化]MVC之Json序列化循环引用

    在做MVC项目时,难免会遇到Json序列化循环引用的问题,大致错误如下 错误1:序列化类型为“...”的对象时检测到循环引用. 错误2:Self referencing loop detected f ...

  9. NetworkComms V3 使用Json序列化器进行网络通信

    刚才在网上闲逛,偶然看到一篇文章 C#(服务器)与Java(客户端)通过Socket传递对象 网址是:http://www.cnblogs.com/iyangyuan/archive/2012/12/ ...

随机推荐

  1. 浅入了解GCD 并发 并行 同步 异步 多线程

     什么是 GCD?! GCD就是一个函数库(废话) 用来压榨系统的资源,解决多线程处理中一些问题的库(知道这个就够了,很多电影角色都是因为知道太多死得很惨!!!!!) 1.并发与并行 Concurre ...

  2. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  3. MVC模式下向qq邮箱发送邮件

    将已经保存在数据库中的密码通过邮件发送到qq邮箱中.用的ssm框架,其中的config文件要先配置好. 用到的jar包有gson-2.2.1.jar,gson.jar,mail.jar,activat ...

  4. Maven使用第三方jar文件的两种方法

    转于http://blog.csdn.net/youhaodeyi/article/details/1729116 主要用于回查与标记 在Maven中,使用第三方库一般是通过pom.xml文件中定义的 ...

  5. C# 获取本机指定类型指定网卡的Ip地址

    1.简单方式 ,适用于单网卡 string hostName = Dns.GetHostName(); IPAddress[] addresses = Dns.GetHostAddresses(hos ...

  6. 总有一项适合你:联想 Miix2 8寸版触摸屏失灵的各项解决方案

    今天试着自己拆开后盖重新拆了一下排线,果然这个方法才是王道.在搜索攻略的时候看到了下面的帖子,觉得总结的不错,特此转载过来:     白色石头 2015-05-22 10:07● 使用评测   总有一 ...

  7. 汇总常用的jQuery操作Table tr td方法

    虽然现在DIV+CSS进行页的布局大行其道,但是很多地方使用table还是有很多优势,用table展示数据是比较方便的,下面汇总了jQuery操作Table tr td常用的方法,熟记这些操作技巧,下 ...

  8. UITableViewCell和UITableView的学习

    一:自定义UITableViewCell: 先来看UITableView.h: - (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSS ...

  9. 安装 webpack

    安装 webpack看好webpack 对自动压缩和文件名自动md5更名,可解决客户端缓存问题.我的安装环境为 centos linux,root用户 1.安装Node及NPM.到NodeJS官网安装 ...

  10. 【OC基础语法考试】

    OC基础语法已经全部学完,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.接下来我会总结前面的OC基础语法,如果大家发现有什么不正确的地方,请指正,小弟是新生,多请 ...