2016年8月9日 星期二

關於線路頻寬目前使用率的計算

如果是歪打正著的好事,你會選擇想辦法修正它還是就算了?

有人要我寫個程式把流量超過90%的trunk發簡訊出來。這個程式不難,兩三下就寫出來了。

試用了幾天,效果還不錯。幾乎都很準確。但...我今天下午發現我似乎對於流量的計算理解錯誤。但更尷尬的是,它竟然很準確...這似乎是一種歪打正著的 觀念。但因為它很準確,我也不曉得要不要投入大把時間去研究其計算公式然後修正我的計算方式還是就算了... ><

結果洗個澡的時候就想到了問題 (這證明了腦力工作需要適當的休息和放鬆)

我原先的作法是:
1、取得目前timestamp
2、取得現在設備的counter值
3、使用rrdtool lastupdate取出最後一筆的timesamp和數值,這邊的重點是,這個數值不是rrd的counter,而是當時用snmpget取得設備上的counter原始值
4、將兩個counter值相減,再乘以8,再除以1024兩次(換算成Mega)
5、再將這個算出來的頻寬除了兩個timestamp的差值,就是目前的頻寬
6、再將這個頻寬除以線路的最大頻寬(跟中華承租的頻寬),就可以算出使用率。
這個方法我覺得是對的,但是不曉得為何一直和流量圖有點微小的誤差。

於是我再去讀了rrdtool裡面的counter值作計算,我發現,其實也可以先取得目前值,再讓rrdtool update後存進rrd檔(採rrd counter格式)。然後再取出counter值,例如1.2e8,然後再將1.2*8再作e8再除以1000兩次,我把這個rrd畫成圖,它的數值和這個方法算出來的是一致的。(注意不是除1024兩次)

結論就是:rrdtool在update時,其實是有存上次設備的counter值,取得新值後再將兩次的值相減後存到rrd檔成為rrd的counter值。 它已經幫我們完成畫圖前的準備減少計算的時間。
而我一開始的作法就是自己用來畫圖的計算公式,簡單的來說,他們是一樣的。所以我的程式才會準確。至於為何會有誤差呢?因為我看的圖不是我作的rrd畫出來的,多少有一點時間差,所以我才會覺得有點不準。

補充:rrd檔用dump可以看到有一個欄位是,就是我所謂的前次值。當初設計者為了加速運算,特別將該值亦存於rrd檔以便計算counter及日後的取用。


沒有留言:

張貼留言