🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付

こんにちは。第一次在Qiita上發表Zabbix的文章。
原本計劃在14日的聖誕倒數日曆上發文,但今天10日似乎沒有其他的投稿者,所以提前發佈了。

這次因為我想要在Zabbix中計算圓周率(?),所以來試試看。

1.圓周率是什麼?

圓周率是圓的直徑與圓周長之間的比例。
用符號π來表示。根據數值顯示,它無限延續為3.1415...。

2.圓周率的求法

求圓周率的方法有很多種,其中代表性的方法是蒙特卡羅法。

首先,考慮半徑為1的圓。
半徑1的圓

接下來,考慮一個與這個圓內接的正方形。
1邊長為2的正方形

此時,圓的面積由於「半徑×半徑×圓周率」的公式得出π,而正方形的面積由於「一邊×一邊」的公式則為4,可以知道正方形對於圓的面積比率是4:π

在這裡,我們考慮在正方形內(包括正方形的邊上)隨機打點。
每個點要麼在圓的內部(包括圓周上),要麼在圓的外部。
打點的想像圖

當打點n次時,若在圓的內部有m個點,
那麼圓內部點數佔總點數的比例為n:m。
這個比例可以近似為正方形對於圓的面積比率,得到4:π≒n:m,即m/n≒π/4
因此,π可以近似為4×m/n

透過增加這個嘗試的次數,可以更精確地求得π的近似值。

3.想要做的事情

在蒙特卡羅法中,我們將撰寫一個腳本,根據隨機數進行一次打點,若該點在圓的內部則返回1,若在外部則返回0。
持續執行這個腳本,取值的平均值就會成為π/4的近似值。
若將這個腳本的返回值收集到Zabbix中,得到的數據平均值就會等於圓周率!?這就是這次的主張。

4.實作過程

首先,我們來寫打點的腳本。

/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秒。

平均值的4倍項目

近似值

這一項目設為1分鐘的間隔。

接著,稍微放置一段時間,待數據有一定的累積後看看近似值。

5分鐘打點(300次打點)的精度

5分鐘打點的精度

30分鐘打點(1,800次打點)的精度

30分鐘打點的程度

1小時打點(3,600次打點)的精度

1小時打點的精度

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

24小時打點(86,400次打點)的精度

24小時打點的精度

精度明顯提高了。

5.結論

那麼,我如何給這個實驗下個結論呢,我陷入了困惑,但是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...附近。
最終圖表

6.總結

這次的實驗感想:

  • 在Zabbix中繪製的圖表讓我享受到了精度逐漸提高的過程
  • 除了圓周率,使用Zabbix來求各種近似值或繪製數學圖形也很有趣

謝謝您閱讀到最後。


原文出處:https://qiita.com/nuon0414/items/d673b4ae6c3ce41953ae


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝16   💬10   ❤️5
416
🥈
我愛JS
📝2   💬8   ❤️4
93
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付