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などオープンソースプロダクトを利用しています。
結果として、各々のオープンソースプロダクトに関する技術の恩恵をダイレクトに得られるというのは素晴らしい事ですね。