こんにちは。はじめてQiitaでZabbixの記事を投稿します。
アドベントカレンダー14日に投稿予定でしたが、本日10日の投稿者がいなさそうだったので、前倒しで投稿しています。
今回は、Zabbixで円周率を求めてみたくなった(?)ので、やってみました。
1.円周率とは?
円周率とは、円の直径に対する円周の長さの比率のことです。
記号でπと表します。数値で見ると3.1415...と無限に続くことが知られています。
2.円周率の求め方
円周率の求め方はいろいろありますが、代表的な手法にモンテカルロ法があります。
この時、円の面積は、「半径×半径×円周率」の公式よりπ、正方形の面積は、「一辺×一辺」の公式より4になり、正方形に対する円の面積比率は4:πであることがわかります。
さて、ここで、正方形の中(正方形の辺上も含むものとする)に、ランダムな打点をすることを考えます。
点は、円の内部(円周上も含むものとする)に入っているか、円の外部に出ているかの2通りです。

打点をn回繰り返した時、円の内部の点がm個であったとすると、
点の総数に対する円の内部の点の割合はn:mになります。
この比率は、正方形に対する円の面積比率に近似でき、4:π≒n:m、すなわちm/n≒π/4となるため、
πは4×m/nで近似できることになります。
この試行を回数を増やすことで、精度高くπの近似値が求められます。
3.やりたいこと
モンテカルロ法の手法において、乱数によってランダムな打点を1回行い、円の内部であれば1、円の外部であれば0を返すスクリプトを組みます。
そのスクリプトを実行し続け、値の平均値をとれば、それがπ/4の近似値になります。
このスクリプトの返り値をZabbixで収集すれば、データの平均値が円周率になるのでは!?というのが今回の主張です。
4.やってみた
まずは打点するスクリプトを書きます。
#!/bin/bash
# 正方形 [-1,1] x [-1,1] 内にランダムに点を打ち、
# 点が単位円 (x^2 + y^2 <= 1) の内側なら "1"、外なら "0" を出力する。
# awk を使って乱数を作り判定する
awk 'BEGIN{
# 乱数を初期化する
srand()
# -1~1の値を2つ取る
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が出てきた…)
UserParameter=mo_pi,/etc/zabbix/script/mo_pi.sh
Webコンソールで、アイテムを設定します。
打点実行アイテム
膨大な回数試行したいので、監視間隔は1sとしときます。
平均値の4倍をとるアイテム
こちらは1m間隔にしておきます
では、しばらく放置して、データがある程度集まったところで近似値を見てみます。
5分打点(300回打点)の精度
30分打点(1,800回打点)の精度
1時間打点(3,600回打点)の精度
あまり精度が高くないです。。。
ホストPCに頑張ってもらい、1日放置してみます。
24時間打点(86,400回打点)の精度
だいぶ精度があがってきました。
5.落としどころ
さて、どうやってオチをつけようか悩んでいましたが、なんとZabbixには円周率が定数関数として定義されています。
この定数と小数点第5位まで一致(誤差約0.00008%未満)になったらメールを飛ばして終わりにしましょう。
誤差計算アイテム
トリガー条件式
数日間待ってみましたが、思ったように精度が上がらず・・・。打点アイテムの数を増やして、スピードアップしたりしました。
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を使っていろいろな近似値を求めたり、数学的なグラフを書いてみるのも面白そう
最後まで読んでいただき、ありがとうございました。












