ZabbixのPingerプロセス高速化と負荷軽減の方法

Zabbix
スポンサーリンク

こんにちは、たらこです。
最近、ネットワーク監視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の処理フロー

簡単にまとめたのが次です。(正確には少し違いますが、雰囲気です)

  1. 全アイテムからアイテムキーが下記になっているアイテムを収集
    • icmpping
    • icmppingloss
    • icmppingsec
  2. 上記アイテムを同一のアイテム設定(アイテムキーパラメータ※、更新時間等)になっている
    アイテムごとに同じグループにまとめる
  3. 上記グループごとに、Ping宛先IPをまとめる
  4. まとめたIPをファイルに書き出して、そのファイルを引数に与えてfpingを実行する
  5. fpingのデフォルト値は下記
    • ping回数:3回
    • 送信間隔:1秒
    • サイズ:56byte or 68byte
    • タイムアウト:500ミリ秒(fping v4.xはパケット毎, fping v3.xは最後のパケット送信後)

※アイテムキーパラメータ:icmpping[A,B,C,D]の「A,B,C,D」の部分

pinger process処理概要図

ここで分かったことは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の処理高速化と負荷軽減について記載しました。
あくまでプロセス数を増やさないで対処したい方の助けになれば幸いです。

では、よいサイバーライフを!

コメント