天天看點

Logstash吞吐量性能優化

原文網址: 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。

  1. filebeat->logstash tcp連接配接
  2. logstash->es tcp連接配接
  3. logstash input
  4. logstash filter
  5. logstash output

filebeat-> logstash tcp連接配接 (目前 非瓶頸)

  1. TCP連接配接數 :之前性能測試,3節點logstash可以承受1000節點filebeat的連接配接。 

        注:當時性能測試方案 1000節點filebeat推流極低,不確定線上日志大時,filebeat連接配接數增高成為瓶頸。

  2. 網絡帶寬: 萬兆網卡支援,無性能瓶頸

logstash-> es tcp連接配接 (目前 非瓶頸)

  1. TCP連接配接數 :logstash後端僅與3個ES節點建立TCP連接配接,連接配接數無問題
  2. 網絡帶寬: 萬兆網卡支援,無性能瓶頸。

logstash input (目前 非瓶頸)

  1. 接收filebeat推送日志,接收量由filter,output協同決定。

logstash filter & logstash output ( 瓶頸)

  1. 更新logstash版本 1.7 -> 2.2 

       2.2版本之後的logstash優化了input,filter,output的線程模型。

  2. 增大 filter和output worker 數量 通過啟動參數配置 -w 48 (等于cpu核數) 

       logstash正則解析極其消耗計算資源,而我們的業務要求大量的正則解析,是以filter是我們的瓶頸。官方建議線程數設定大于核數,因為存在I/O等待。考慮到我們目前節點同時部署了ES節點,ES對CPU要求性極高,是以設定為等于核數。

  3. 增大 woker 的 batch_size 150 -> 3000 通過啟動參數配置 -b 3000 

       batch_size 參數決定 logstash 每次調用ES bulk index API時傳輸的資料量,考慮到我們節點機256G記憶體,應該增大記憶體消耗換取更好的性能。

  4. 增大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 調用次數

  1. 根據CPU核數調整合适的worker數量,觀察系統負載。
  2. 根據記憶體堆大小,調整batch_size,調試JVM,觀察GC,線程是否穩定。
  3. 調整flush_size,這個值預設500,我在生産環境使用的1500,這個值需要你逐漸增大,觀察性能,增大到一定程度時,性能會下降,那麼那個峰值就是适合你的環境的。