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測試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM