2017年1月12日 星期四

RRD檔爆值導致數值爆表時的處理方式 (RRD破圖)

之前有建一些RRD檔來收設備的流量,後來就順便弄一個日報表看來有沒有線路需要擴頻或者調節頻寬的。一開始也順順的,但後來就開始遇到爆量這件事。









後來由於有更重要的報表要參考這些流量,因此只好認真的來解決這個問題。
在網路上翻了一下之後就確定問題了。

原因是我建立rrd檔時,沒有設定正確的上限值,為避免麻煩我都是定『U』,代表不做上限。

但設備的2^64的counter遲早都是會爆的,它爆了之後,rrdtool不曉得該如何處理,就幫你單純的用減法來減,因此在剛爆的時候,數值一減都很驚人。 (試想0-2^64的值有多大)

有想過很多的解法,例如異常值不進RRD檔,這邊的作法有兩種,一者是若第一名的流量是第二名的10倍以上就放棄它。(然後用遞迴來處理....),第二種作法是先確定線路的最大頻寬若流量大於它就將之放棄。但經過實驗證實,這兩種方法都很爛。所以才有了修正RRD檔的作法 。

修正RRD檔的作法其實也很簡單,就把它dump出來,修正一下上限再倒回去就好了。問題是,上限該怎麼決定呢?


如果你有用cacti的話,可能會有印象,cacti使用的值的來源應該就是它去抓取介面的SNMP MIB的ifSpeed的值。用這個值其實就可以了。一般是10^8(100M)或10^9(1G)

但我的線路有很多種,往上還有2.5G及5G,我就設定為10^10。(不過在實務上我還是把它除以8,因為我認為ifSpeed是bit,應該要用snmpget到的byte來算會比較準)

2017/01/20 補充後續:
之前設定3.1250000000e+08的時,估計最大頻寬是2.5G,果然今天就破圖了
不過這也證明了,小弟的假設是正確的。max的準確設定值確實應該以BYTE來計算。
但如果要偷懶還是以cacti的預設值:10,000,000,000來填入吧,這樣最大值是80Gbps流量,除非用100Gbps的port,不然應該很難再破圖。



沒有留言:

張貼留言