原文網址: http://blog.csdn.net/houzhe_adore/article/details/51315036
Logstash性能優化:
場景:
部署節點配置極其牛逼(三台 48核 256G記憶體 萬兆網卡的機器),ES性能未達到瓶頸,而filebeat又有源源不斷的日志在推送(日志堆積),此時卻發現ES吞吐量怎麼也上不去,基本卡在單logstash 7000/s 的吞吐。
這時候我們基本确定瓶頸在logstash上。logstash部署在服務端,主要處理接收filebeat(部署在節點機)推送的日志,對其進行正則解析,并将結構化日志傳送給ES存儲。對于每一行日志進行正則解析,需要耗費極大的計算資源。而節點CPU負載恰巧又不高,這個時候我們就要想辦法拓寬logstash的pipeline了,畢竟我們一天要收集18億條日志。
ELFK部署架構圖如下所示:
影響logstash性能因素如下:
logstash是一個pipeline,資料流從input進來,在filter進行正則解析,然後通過output傳輸給ES。
- filebeat->logstash tcp連接配接
- logstash->es tcp連接配接
- logstash input
- logstash filter
- logstash output
filebeat-> logstash tcp連接配接 (目前 非瓶頸)
-
TCP連接配接數 :之前性能測試,3節點logstash可以承受1000節點filebeat的連接配接。
注:當時性能測試方案 1000節點filebeat推流極低,不確定線上日志大時,filebeat連接配接數增高成為瓶頸。
- 網絡帶寬: 萬兆網卡支援,無性能瓶頸
logstash-> es tcp連接配接 (目前 非瓶頸)
- TCP連接配接數 :logstash後端僅與3個ES節點建立TCP連接配接,連接配接數無問題
- 網絡帶寬: 萬兆網卡支援,無性能瓶頸。
logstash input (目前 非瓶頸)
- 接收filebeat推送日志,接收量由filter,output協同決定。
logstash filter & logstash output ( 瓶頸)
-
更新logstash版本 1.7 -> 2.2
2.2版本之後的logstash優化了input,filter,output的線程模型。
-
增大 filter和output worker 數量 通過啟動參數配置 -w 48 (等于cpu核數)
logstash正則解析極其消耗計算資源,而我們的業務要求大量的正則解析,是以filter是我們的瓶頸。官方建議線程數設定大于核數,因為存在I/O等待。考慮到我們目前節點同時部署了ES節點,ES對CPU要求性極高,是以設定為等于核數。
-
增大 woker 的 batch_size 150 -> 3000 通過啟動參數配置 -b 3000
batch_size 參數決定 logstash 每次調用ES bulk index API時傳輸的資料量,考慮到我們節點機256G記憶體,應該增大記憶體消耗換取更好的性能。
-
增大logstash 堆記憶體 1G -> 16G
logstash是将輸入存儲在記憶體之中,worker數量 * batch_size = n * heap (n 代表正比例系數)
worker * batch_size / flush_size = ES bulk index api 調用次數
調優結果:
三節點 logstash 吞吐量 7000 -> 10000 (未達到logstash吞吐瓶頸,目前叢集推送日志量備援) logstash不處理任何解析,采用stdout輸出方式,最高吞吐 11w/s
叢集吞吐量 24000 -> 32000 (未飽和)
stop兩個logstash節點後,單節點logstash吞吐峰值15000 (叢集目前應該有 2w+ 的日品質,單節點采集1w5,是以為單節點峰值)
叢集調優前:
叢集調優後:
最後觀察,系統負載也一下上去了
最後,總結一下調優步驟:
worker * batch_size / flush_size = ES bulk index api 調用次數
- 根據CPU核數調整合适的worker數量,觀察系統負載。
- 根據記憶體堆大小,調整batch_size,調試JVM,觀察GC,線程是否穩定。
- 調整flush_size,這個值預設500,我在生産環境使用的1500,這個值需要你逐漸增大,觀察性能,增大到一定程度時,性能會下降,那麼那個峰值就是适合你的環境的。