こんにちは、たらこです。
最近、ネットワーク監視OSSとして有名なZabbixをちょっといじってます。
大量のホストを監視する中でicmp pinger processの処理負荷が問題になったので、
解決案と最終的にどうしたかを備忘録として記載していきます。
ちなみにバージョンは3.0で実施しましたが、最新バージョンでもProcess自体の仕様は
変更されていないので、同様であると思われます。
こんな人に読んでほしい
- Zabbixのicmp pinger processの負荷軽減方法を探している人
- プロセスを増やしたくないがZabbix busy icmp pinger processes, in % を何とかしたい人
- icmp pinger processがざっくりとどんなことをしているか知りたい人
Zabbix busy icmp pinger processesが常に70%付近だった
pinger負荷が高いと気づいたのは内部監視で「Zabbix busy icmp pinger processes, in %」が
75%を超えてALMが発生したことでした。pingアイテムの更新待ちキューもたまっていて、
遅延が発生している模様。これはまずい。
ヒストリを確認してみると、常に70%前後をうろうろしている状態。
Zabbix ServerのConfigでicmp pinger processは3プロセス起動するように設定していますが、
これ以上プロセスは増やしたくない……
一方でZabbix ServerのCPU負荷は100%に張り付いているような状態ではなく、
どちらかというとCPUには余裕がある状態でした。
ここで疑問が生じます。
CPUに空きがあるのに、icmp pinger processの処理負荷が高いのはなぜ?
CPUに空きがあるなら、プロセスはもっと高速に処理できるはずです。
ということは、icmp pinger processのプロセス自体の処理で何かしらのボトルネックがある、
と考えました。
ということで、icmp pinger processはどんな処理をしてるか、まずは調査してみました。
icmp pinger processの処理フロー
簡単にまとめたのが次です。(正確には少し違いますが、雰囲気です)
- 全アイテムからアイテムキーが下記になっているアイテムを収集
- icmpping
- icmppingloss
- icmppingsec
- 上記アイテムを同一のアイテム設定(アイテムキーパラメータ※、更新時間等)になっている
アイテムごとに同じグループにまとめる - 上記グループごとに、Ping宛先IPをまとめる
- まとめたIPをファイルに書き出して、そのファイルを引数に与えてfpingを実行する
- fpingのデフォルト値は下記
- ping回数:3回
- 送信間隔:1秒
- サイズ:56byte or 68byte
- タイムアウト:500ミリ秒(fping v4.xはパケット毎, fping v3.xは最後のパケット送信後)
※アイテムキーパラメータ:icmpping[A,B,C,D]の「A,B,C,D」の部分
ここで分かったことは3つ。
- icmpping,icmppingloss,icmppingsecはアイテム毎にpingを実行しているわけではない
- アイテム設定がすべて同じであればホストごとに1度だけ実行される
- アイテム設定を同一にしないと、別々にPingが実行されてしまう
- pingはfpingで実行していて、デフォルト3回、1秒間隔で送信している
上記からicmp pinger processの処理高速化と負荷軽減について考えてみました。
あくまで起動時のicmp pinger processを増加させるという方法は除いて考察。
icmp pinger processの処理高速化
1. pingの送信間隔をデフォルト1秒よりも短くする
デフォルトは1秒間隔で3回送信しているので、
1回目送信→1秒待つ→2回目送信→1秒待つ→3回目送信という形になります。
つまり、デフォルトでは2秒間無駄なウェイトが発生しています。
通常Pingの応答時間は長くても数十ミリ秒ですから、送信間隔を短くするだけで、
処理が大幅に高速化されます。
Ping応答時間を20ミリ秒(0.02秒)と見積もれば処理時間は下記のようになります。
処理 | 送信間隔変更前(処理時間) | 送信間隔変更後(処理時間) |
1回目送信→応答 | 0.02秒 | 0.02秒 |
送信待ち | 1.00秒 | 0.20秒 |
2回目送信→応答 | 0.02秒 | 0.02秒 |
送信待ち | 1.00秒 | 0.20秒 |
3回目送信→応答 | 0.02秒 | 0.02秒 |
合計 | 2.06秒 | 0.46秒 |
おおよそ、1ホストあたり▲1.6秒の短縮(▲78%)となります。
送信間隔の調整方法はアイテムキーパラメータを設定するだけです。
公式ドキュメントより、パラメータは下記のように設定できます
icmpping[<target>,<packets>,<interval>,<size>,<timeout>]
引用:公式ドキュメント
icmppingloss[<target>,<packets>,<interval>,<size>,<timeout>]
icmppingsec[<target>,<packets>,<interval>,<size>,<timeout>]
https://www.zabbix.com/documentation/4.2/manual/config/items/itemtypes/simple_checks#icmp_pings
設定例を下記に記載します。
- 送信間隔を200ミリ秒にする場合
- icmpping[,,200]
- icmppingloss[,,200]
- icmppingsec[,,200]
メリットは上記のように処理が高速化されることですが、
送信間隔を短くするデメリットとしてはCPU負荷がその分上昇するということです。
より処理できる量が増えるため、例えばicmp pinger process busyが100%となっているような
状況では、上記設定をすることで、100%を超えた分の処理ができるようになるため、
その分CPU負荷が増加します。
設定の際には、実際に一度試験してみてから適用するようにしてください。
2. pingの送信回数をデフォルトの3回から減少させる
デフォルト3回送信のところを例えば1回にすることで、2回分の処理を減らし、
その分高速化が期待できます。
が、そもそもPing応答時間は数十ミリ秒ですから、2回減らしても高速化への効果としては
あまり期待できません。
設定例を下記に記載します。
- 送信回数を1回にする場合
- icmpping[,1]
- icmppingloss[,1]
- icmppingsec[,1]
icmp pinger processの負荷軽減
1. ping関連のアイテムの設定を全アイテム同一にする
処理フローにも記載した通り、アイテム設定が同一であれば、ping処理は1度で済みます。
もし、icmpping,icmppingloss,icmppingsecのアイテム設定をバラバラにしているのであれば
全アイテムで設定を同一にすることで、負荷軽減が期待できます。
最終的な設定はどうしたか
最終的な設定としてはCPUに余裕があったため、Pingの送信間隔を200ミリ秒に設定することで、
icmp pinger processのボトルネックが解消され、
Zabbix busy icmp pinger processesは70%→15%に減少しました。
なお、変更前後でCPU負荷に変化は見られませんでした。
これにて解決。
まとめ
今回はZabbixのicmp pinger processの処理高速化と負荷軽減について記載しました。
あくまでプロセス数を増やさないで対処したい方の助けになれば幸いです。
では、よいサイバーライフを!
コメント