icmppingのタイムアウト
こんにちは。
ふと疑問に思ったんですが、 icmpping のタイムアウトのパラメーターは、意味あるんでしょうか?
マニュアルを見ると、icmpping は
fping -C packets -p interval -b size -t timeout
というコマンドを実行するように書いてあります。
https://www.zabbix.com/documentation/2.2/jp/manual/config/items/itemtype...
実際ソース(src/libs/zbxicmpping/icmpping.c)を見てもそうなっているようです。
#-C 以外はパラメーターの指定がある(0 でない)ときだけオプションを追加しているようです。
#2.2.11 のソースを見ましたが、たぶんどのバージョンでも同じだと思います。
そして man fping での -t の説明はこうなっています。
-t n Initial target timeout in milliseconds (default 500). In the default mode,
(略)
Note that this option has no effect looping or counting modes (-l, -c, or -C).
つまり、 -C オプションを指定したら -t は無意味、ということですよね。
ということは icmpping のタイムアウトパラメーターも意味が無いように思うのですが、実際のところどうなんでしょうか?
TNK - 投稿数: 4769
実際にコマンドラインで実行してみていただければわかりますが、
-Cオプションと-tオプションの併用はできるようです。
わざと応答が返ってこないような相手にfpingを実行すると、コマ
ンドの終了までの時間が、おおよそ-tで指定する時間の差分だけ変
化しました。
例えば、-t 1000を指定したときに2秒程度かかったとします。
-t 5000を指定すると6秒程度、-t 10000を指定すると11秒程度かか
ります。
恐らく、ループする際に毎回タイムアウトまで待つのではなく、
最終的な応答待ちまでのタイムアウト時間を指定しているような
感じなのだと思います。
環境や-Cで指定する回数にもよりますが、-Cを指定したから、
かならずデフォルトの-t 500になるというわけではないようです。
ちなみに、利用したfpingのバージョンは、2.4b2と3.10で、両方と
もZabbix SIAからダウンロードしたものです。
heya - 投稿数: 319
ありがとうございます。
やっぱり fping のマニュアルが間違っているということですかね。
こちらでも試してみました。どうも ((-pで指定した時間 * (-C の指定 - 1)) + -t で指定した時間)ミリ秒とちょっとかかっている感じです。
#-p のデフォルトは 1000 です。
shell$ time fping -C 3 -t 5000 xx.xx.xx.xx(存在しないアドレス)
xx.xx.xx.xx : - - -
real 0m7.028s
user 0m0.000s
sys 0m0.004s
1000*(3-1)+5000 = 7000 となり、だいたい同じ。
同様に、
time fping -C 3 -t 10000 xx.xx.xx.xx
→real 0m12.029s (1000*(3-1)+10000 = 12000)
time fping -C 3 -p 2000 -t 10000 xx.xx.xx.xx
→real 0m14.026s (2000*(3-1)+10000 = 14000)
ついでに、こっちもソースを見てみました(fping 3.10 の fping.c)。
/* Loop and count mode: schedule next ping */
else if(loop_flag || (count_flag && h->num_sent < count))
{
h->ev_type = EV_TYPE_PING;
h->ev_time.tv_sec = last_send_time.tv_sec;
h->ev_time.tv_usec = last_send_time.tv_usec;
timeval_add(&h->ev_time, perhost_interval);
ev_enqueue(h);
}
/* Count mode: schedule timeout after last ping */
else if(count_flag && h->num_sent >= count) {
h->ev_type = EV_TYPE_TIMEOUT;
h->ev_time.tv_sec = last_send_time.tv_sec;
h->ev_time.tv_usec = last_send_time.tv_usec;
timeval_add(&h->ev_time, h->timeout); ★
ev_enqueue(h);
}
どうも★のところで何かやっていそうなのですが、ここで力尽きました。
ただ、コメントを見ると、カウントモードなら「最後の ping を出してからタイムアウトを設定する」ということですかね?それだと試してみた結果とも一致します。
というわけで、コメントに書いてある通り、と思っておくことにします。
#ループモード(-l 指定)の方では timeout というのが出てこないし、こっちは本当に関係無さそうな感じです。