munin-asyncd 75秒の壁

今さらながら munin-asyncd を使ってみたんだけど、どうも munin-node からの値取得が75秒以上かかる場合に問題が出るようだ。。。

# ack --color -H 0.75 -C /usr/local/share/munin/munin-asyncd
/usr/local/share/munin/munin-asyncd-157-	# start the next run close to the end of a munin-node update operation
/usr/local/share/munin/munin-asyncd-158-	# (i.e. try to avoid overlapping activities)
/usr/local/share/munin/munin-asyncd:159:	my $when_next = int((int($when / $minrate) + 0.75) * $minrate);
/usr/local/share/munin/munin-asyncd-160-	while ($when_next <= $when) {
/usr/local/share/munin/munin-asyncd-161-		$when_next = $when_next + $minrate;  

以下推測。
munin-asyncd は5分刻みの75秒前に munin-node に値を取得しにいって
list してシーケンシャルに fetch $servece していって、最初の time で値を保存する。
75秒後に munin-cron の munin-update からリクエストが来て、前回の spoolfetch 中の timestamp で spoolfetch $time する。
前回の spoolfetch のタイミングで munin-asyncd が動作中だと、それまでに終わっている値は送られるのだけど、まだ終わっていない分は送られず、次回の spoolfetch にも含まれず、この分が欠落する。

munin-ayncd --fork などを使うと解決するのだけれど load average スパイクが起こるかも。

github には複数 Issue が寄せられています。次期メジャーバージョンアップでは改善するかもです。

追記: s/75秒/150秒/

コメントする

perl adv
perl adv