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
の組み合わせが最速かつ簡単な記述となった。