Help us understand the problem. What is going on with this article?

ZabbixサーバのPHPを高速化する

More than 5 years have passed since last update.

ZabbixサーバのPHPを高速化する

はじめに

BounscaleというオートスケールするHeroku Addonを作っています。
Bounscaleはオートスケーリングの実施をするバックエンド部分にオープンソースの監視ソフトZabbixを利用しています。

サービスとしてZabbixサーバにどれだけのテナントを集積できるのかは、価格競争力向上・利益向上、あるいはフリーミアムなどのビジネス展開戦略上、非常に重要となってきます。
なので、継続的に様々にチューニングを実施しているのですが、その中でそれなりに分かりやすく効果があったのがPHPのアクセラレータの適用だったので、軽く記録しておきたいと思います。

なぜPHP?

ZabbixサーバとエージェントそのものはCで組まれています。PHPはZabbix APIと呼ばれるWebAPIの提供に使われています。

PHPアクセラレータAPC

APC(Alternative PHP Cache)はPHPを高速化します。
PHPはインタプリタ言語なので原則的にアクセスがあるたびに都度コンパイルされて動作するのですが、APCはあらかじめ事前コンパイルしておいてメモリに格納し、負荷を下げるというものです。

導入前の状態

topで見た感じロードアベレージは8~9位あります。
5以上は重いサーバ、10を超えるとサーバ毎落ちてもおかしくないと言われているので、これはかなりまずいです。

top - 05:41:15 up 21 days,  4:38,  1 user,  load average: 8.84, 9.01, 8.96
Tasks: 119 total,  10 running, 109 sleeping,   0 stopped,   0 zombie
Cpu(s): 37.2%us,  8.1%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si, 54.7%st
Mem:   1696964k total,  1328256k used,   368708k free,   159752k buffers
Swap:   917500k total,        0k used,   917500k free,   637228k cached

導入手順

apcを導入します。導入はとても簡単で普通にyumで入りました。

yum install php-pecl-apc
service httpd restart

再起動すると勝手に有効になっています。
一応下記のコマンドでapc.enabledがONになっているか確認します。

$ php -i | grep apc
Additional .ini files parsed => /etc/php.d/apc.ini,
apc
MMAP File Mask => /tmp/apc.XXXXXX
apc.cache_by_default => On => On
apc.canonicalize => On => On
apc.coredump_unmap => Off => Off
apc.enable_cli => Off => Off
apc.enable_opcode_cache => On => On
apc.enabled => On => On
apc.file_md5 => Off => Off
apc.file_update_protection => 2 => 2
apc.filters => no value => no value
apc.gc_ttl => 3600 => 3600
apc.include_once_override => Off => Off
apc.lazy_classes => Off => Off
apc.lazy_functions => Off => Off
apc.max_file_size => 1M => 1M
apc.mmap_file_mask => /tmp/apc.XXXXXX => /tmp/apc.XXXXXX
apc.num_files_hint => 1000 => 1000
apc.preload_path => no value => no value
apc.report_autofilter => Off => Off
apc.rfc1867 => Off => Off
apc.rfc1867_freq => 0 => 0
apc.rfc1867_name => APC_UPLOAD_PROGRESS => APC_UPLOAD_PROGRESS
apc.rfc1867_prefix => upload_ => upload_
apc.rfc1867_ttl => 3600 => 3600
apc.serializer => default => default
apc.shm_segments => 1 => 1
apc.shm_size => 64M => 64M
apc.slam_defense => On => On
apc.stat => On => On
apc.stat_ctime => Off => Off
apc.ttl => 0 => 0
apc.use_request_time => On => On
apc.user_entries_hint => 4096 => 4096
apc.user_ttl => 0 => 0
apc.write_lock => On => On

導入後の状態

下記の感じでロードアベレージが3~4位に下がりました。
依然としてidleは0なのでこれでもまだ重いという見方もありますが、効果はありました。

top - 05:55:50 up 21 days,  4:52,  1 user,  load average: 3.70, 4.21, 6.01
Tasks: 110 total,   5 running, 105 sleeping,   0 stopped,   0 zombie
Cpu(s): 31.1%us, 12.9%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.6%si, 55.3%st
Mem:   1696964k total,  1212980k used,   483984k free,   159764k buffers
Swap:   917500k total,        0k used,   917500k free,   653836k cached

おわりに

Zabbixそのものもオープンソースですが、Zabbixの周辺技術もPHPやApacheなどオープンソースプロダクトを利用しています。
結果として、各々のオープンソースプロダクトに関する技術の恩恵をダイレクトに得られるというのは素晴らしい事ですね。

shouta-dev
Railsが大好き!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away