fpingについて

fpingは並列で複数ホストにPingチェックを行ってくれるため、チェックしたいサーバ全台をループで回してpingを送るよりも高速に実行できる。
ただfpingのオプションを適切にすることでさらに高速に実行できるし、fpingと組み合わせるコマンドの工夫でさらに高速に実行できる。

fpingの高速化

オプション無し

まずはオプションを指定せずに一番遅い方法を見てみる。

$ time cat all_list | xargs fping -a > alive_list
real    0m10.328s
user    0m0.008s
sys     0m0.014s

all_listに書かれている100台のうち、30台が疎通が取れない状態であるとする。疎通のとれる70台をalive_listに書き出したい。aliveであるものだけを出力するオプション-aのみを指定し、速度にかかわるオプションは何もない状態で実行すると10秒かかった。

オプション有り

オプションについて

fpingの速度にかかわるオプションは以下の3種類ある。

option explanation
-i n The minimum amount of time (in milliseconds) between sending a ping packet to any target (default is 25).
-r n Retry limit (default 3). This is the number of times an attempt at pinging a target will be made, not including the first try.
-t n Initial target timeout in milliseconds (default 500). In the default mode, this is the amount of time that fping waits for a response to its first request. Successive timeouts are multiplied by the backoff factor.

-iが各サーバへpingを送る間隔、-rが初回を除いて最大何回リトライするか、-tがタイムアウト値となる。
ネットワークがあふれる可能性があるので、以下の範囲の値はrootユーザでなければ実行できない。

    -i n   where n < 10  msec
    -r n   where n > 20
    -t n   where n < 250 msec

これらのオプションを使って、高速化していく。

-iオプション

最小の1に設定して実行する。rootユーザで実行するか、fpingにsudoをつけて実行する。

$ time cat all_list | xargs sudo fping -i1 -a > alive_list
real    0m7.272s
user    0m0.015s
sys     0m0.011s

-rオプション

最小の1に設定して実行する。

$ time cat all_list | xargs fping -r1 -a > alive_list
real    0m5.884s
user    0m0.011s
sys     0m0.008s

-tオプション

-iオプションと-rオプションは間隔やリトライ回数なので、安定した環境であれば最小値の1を指定しても通常であれば正しく値をとれるが、-tオプションはタイムアウト値なので1ではなく20くらいにしておく。

$ time cat all_list | xargs sudo fping -t20 -a > alive_list
real    0m7.033s
user    0m0.013s
sys     0m0.011s

-i, -r, -tオプション組み合わせ

3つのオプションをすべて指定して実行する。

$ time cat all_list | xargs sudo fping -i1 -r1 -t20 -a > alive_list
real    0m2.606s
user    0m0.006s
sys     0m0.009s

オプションを指定しなかったときは10秒かかっていたものが2.6秒まで早くなった。

xargsの並列実行

fpingと組み合わせるコマンドの機能を使って高速化を図ってみる。xargsの-Pオプションを使って並列実行する。fpingの並列実行数を指定することはできないのに対し、xargsの並列実行数は指定できるし、0を設定すれば可能な限りのプロセス数で並列実行してくれる。

$ time cat all_list | xargs -I% -P0 fping -a % | sort > alive_list
real    0m4.115s
user    0m0.017s
sys     0m0.062s

xargsで並列実行しているので、出力順がバラバラになってしまう。最後にsortを加えて出力を整えた。実行時間は10秒から4秒に縮まった。

fpingの-tオプションを合わせてみる。

$ time cat all_list | xargs -I% -P0 sudo fping -t20 -a % | sort > alive_list
real    0m0.340s
user    0m0.202s
sys     0m0.339s

1秒未満で実行できるようになった。高速化としては十二分なので、-t以外のオプションをつける必要はもうないだろう。xargsとの組み合わせとして、-iオプション単体、-rオプション単体でも実行してみたが-tオプションほどは効果がでなかった。

結論としては、xargs -P0 -I%fping -t20の組み合わせが最速かつ簡単な記述となった。