zoukankan      html  css  js  c++  java
  • 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: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测试。
  • 相关阅读:
    Springboot使用slf4j记录日志和lombok(能用的1)-主要看这个!
    mysql-覆盖索引(转载)(收藏过)
    Github上开源仿京东商城项目启动配置详解(小白版)
    java8 stream常用用法(转载)
    JDK下载过慢的问题解决方案
    intellij idea 的全局搜索快捷键方法(转载)
    Linux终端复制粘贴快捷命令
    Kali入门配置
    Google搜索
    Dig
  • 原文地址:https://www.cnblogs.com/xing901022/p/5665271.html
Copyright © 2011-2022 走看看