今天跟
峽谷金橋
聊天,詢問起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測試。