こんにちは。第一次在Qiita上發表Zabbix的文章。
原本計劃在14日的聖誕倒數日曆上發文,但今天10日似乎沒有其他的投稿者,所以提前發佈了。
這次因為我想要在Zabbix中計算圓周率(?),所以來試試看。
圓周率是圓的直徑與圓周長之間的比例。
用符號π來表示。根據數值顯示,它無限延續為3.1415...。
求圓周率的方法有很多種,其中代表性的方法是蒙特卡羅法。
首先,考慮半徑為1的圓。

接下來,考慮一個與這個圓內接的正方形。

此時,圓的面積由於「半徑×半徑×圓周率」的公式得出π,而正方形的面積由於「一邊×一邊」的公式則為4,可以知道正方形對於圓的面積比率是4:π。
在這裡,我們考慮在正方形內(包括正方形的邊上)隨機打點。
每個點要麼在圓的內部(包括圓周上),要麼在圓的外部。

當打點n次時,若在圓的內部有m個點,
那麼圓內部點數佔總點數的比例為n:m。
這個比例可以近似為正方形對於圓的面積比率,得到4:π≒n:m,即m/n≒π/4,
因此,π可以近似為4×m/n。
透過增加這個嘗試的次數,可以更精確地求得π的近似值。
在蒙特卡羅法中,我們將撰寫一個腳本,根據隨機數進行一次打點,若該點在圓的內部則返回1,若在外部則返回0。
持續執行這個腳本,取值的平均值就會成為π/4的近似值。
若將這個腳本的返回值收集到Zabbix中,得到的數據平均值就會等於圓周率!?這就是這次的主張。
首先,我們來寫打點的腳本。
/etc/zabbix/script/mo_pi.sh
#!/bin/bash
# 在正方形 [-1,1] x [-1,1] 中隨機打點,
# 若該點在單位圓 (x^2 + y^2 <= 1) 內則輸出 "1",若在外則輸出 "0"。
# 使用awk生成隨機數並進行判斷
awk 'BEGIN{
# 初始化隨機數
srand()
# 取範圍為-1到1的兩個隨機數
x = rand()*2 - 1
y = rand()*2 - 1
# 判斷該點是否在圓內
if (x*x + y*y <= 1) {
print 1
} else {
print 0
}
}'
接下來試執行幾次。
執行結果
[root@localhost script]# ./mo_pi.sh
1
[root@localhost script]# ./mo_pi.sh
1
[root@localhost script]# ./mo_pi.sh
0
[root@localhost script]# ./mo_pi.sh
0
[root@localhost script]# ./mo_pi.sh
1
[root@localhost script]# ./mo_pi.sh
1
[root@localhost script]# ./mo_pi.sh
1
[root@localhost script]# ./mo_pi.sh
1
[root@localhost script]# ./mo_pi.sh
1
[root@localhost script]# ./mo_pi.sh
1
感覺大約有3/4的機率返回1。
因為希望能在Zabbix中收集這個腳本的返回值,所以我們將設定User parameter。(終於開始和Zabbix有關了…)
/etc/zabbix/zabbix_agent2.conf
UserParameter=mo_pi,/etc/zabbix/script/mo_pi.sh
在Web控制台上,設定一個項目。

因為希望能嘗試大量的次數,所以監控間隔設為1秒。

這一項目設為1分鐘的間隔。
接著,稍微放置一段時間,待數據有一定的累積後看看近似值。



精度似乎不高。。。
讓主機盡力運行一整天再說。

精度明顯提高了。
那麼,我如何給這個實驗下個結論呢,我陷入了困惑,但是Zabbix其實已經將圓周率定義為常數函數。

當這個常數與小數點第5位的近似值一致(誤差約0.00008%以下)時,就發送郵件結束。

取常數函數與計算出的近似值的絕對差值。

在待了幾天後,我發現精度並沒有如預期般提升……。於是我增加了打點項目的數量以期加速計算。
/etc/zabbix/zabbix_agent2.conf
UserParameter=mo_pi,/etc/zabbix/script/mo_pi.sh
UserParameter=mo_pi1,/etc/zabbix/script/mo_pi1.sh
UserParameter=mo_pi2,/etc/zabbix/script/mo_pi2.sh
UserParameter=mo_pi3,/etc/zabbix/script/mo_pi3.sh
UserParameter=mo_pi4,/etc/zabbix/script/mo_pi4.sh
UserParameter=mo_pi5,/etc/zabbix/script/mo_pi5.sh
UserParameter=mo_pi6,/etc/zabbix/script/mo_pi6.sh
UserParameter=mo_pi7,/etc/zabbix/script/mo_pi7.sh
UserParameter=mo_pi8,/etc/zabbix/script/mo_pi8.sh
UserParameter=mo_pi9,/etc/zabbix/script/mo_pi9.sh
UserParameter=mo_pi10,/etc/zabbix/script/mo_pi10.sh

收到了郵件。

最後的圖表顯示,數據已經相當穩定地集中在3.1415...附近。

這次的實驗感想:
謝謝您閱讀到最後。