閱讀301 返回首頁    go 阿裏雲 go 技術社區[雲棲]


filebeat實踐-內存占用-最大內存占用

今天浣熊給大家分享下filebeat在實踐中內存的耗用情況.filebeat作為日誌采集agent, 是需要部署到生產服務器上的.不理解filebeat的工作機製,不了解filebeat在實際生產使用中的內存使用將會給你帶來意想不到的麻煩.

有些文章說filebeat內存消耗很少,不會超過100M, 這簡直是不負責任的胡說,假如帶著這樣的認識把filebeat部署到生產服務器上就等著哭吧.

filebeat在空載情況(沒有日誌可采集)下的確不會有大的內存開銷,但在有大量的日誌需要采集時,filebeat的內存占用是沒有固定值的, 那有沒有理論值呢?答案是有, 為啥這麼說,看下麵公式:

                              bytes_each_log * spool_size * M + a*N

其中, bytes_each_log是單條日誌大小, spool_size是配置文件裏配置項,  M是單條日誌在內存裏的溢價係數(>1), N表示采集的文件個數,a為常數.

spool_size的默認值是2048, 好多人估計都不會配置這個項,也會因此埋下禍根(OOM):

1240
10MB為filebeat支持的單條日誌最大長度,超過的將會被截斷丟棄

假設忽略a*N部分的內存開銷, 單條日誌的內存溢價為3, 一旦出現單條日誌大於50KB且有瞬間爆發量的時候, filebeat的內存占用將大於300MB,是不是有點嚇人!如果出現了極端情況,單條日誌>10M,即使filebeat會截斷到10M那也是20GB!!是不是腿都軟了!!!

filebeat在實際使用過程中內存>300M,甚至15GB的情況浣熊都遇到過, 內存超過300M幾乎經常遇到,基本都是因為客戶沒有按照吩咐的去做導致的; 15GB的那次有點意外和驚喜, 客戶在自己的日誌文件裏打了大量的二進製文件(後來知道真相的我眼淚掉下來...), 大量的二進製文件觸發了10MB規則,還好吃掉15GB內存後filebeat因OOM退出了,沒有帶來嚴重的損失.

那怎麼樣才能避免以上內存災難呢?劃重點了,快快拿出小本本記錄:

(1)每個日誌生產環境生產的日誌大小,爆發量都不一樣, 要根據自己的日誌特點設定合適的spool_size值;什麼叫合適,至少能避免內存>200MB的災難;

(2)在不知道日誌實際情況(單條大小,爆發量), 務必把spool_size設置上,建議128或者256;

最後分享張實踐圖片:

        單條日誌為45KB, spool_size為2048的內存開銷,陡坡下是spool_size調整為128的效果.

1240


最後更新:2017-11-11 23:34:52

  上一篇:go  RabbitMQ安裝
  下一篇:go  移動硬盤刪除的文件怎麼免費恢複教程