どうも、開発2部サーバー担当の山本です。
オーツーでは各セクションで情報共有や全体的なスキルアップを目的とした勉強会を定期的に行っています。
今回は先日のサーバー勉強会で発表したApache(httpd)のプロセス数のチューニングについて紹介します。
ApacheはゲームのAPIサーバーを構築する上で定番のミドルウェアですが、適切なチューニングはできていますか?
CPUやメモリなどのリソース不足でパフォーマンスを十分に発揮できていなかったり、逆にリソースが余りすぎてインフラコストが無駄になっていたりしませんか?
チューニングの必要性と今回の目的
Apacheのチューニングは「パフォーマンスの向上」や「インフラコストの最適化」を行う上で重要な要素になります。
今回の記事ではプロセス数とCPUを調整し、ボトルネックを探りながらベンチマークをとってみたので、「Apacheのチューニングってどうするんだろう?」という方の足掛かりになればと思います。
環境
- CentOS 7.1(Virtual Box)
- Apahce 2.4(MPMはprefork)
- PHP 7.1
ホストマシンからJMeterを使って簡単なPHPのページを20同時接続の1000回ループでアクセスして、スループット(単位時間当たりの処理性能)を計測します。
初めはCPU1つでApacheのプロセスを増やしていき、次にCPUを4つに変えて同じ計測を行います。
Apacheのプロセス数はhttpd.confを以下のようにStart、Min、Maxを揃えてforkが発生しないようにしています。
MaxConnectionsPerChildはプロセスがkillされるまでのリクエスト数で、これを0にしているのは計測中にforkを発生させないためですが、実際のサービスではメモリリーク対策として設定しておくことをおすすめします。
StartServers 1 MinSpareServers 1 MaxSpareServers 1 ServerLimit 1 MaxRequestWorkers 1 MaxConnectionsPerChild 0
計測
CPU×1
プロセス数が1の場合
スループット:406.7rps
id(idle)がCPUの空きですが、負荷計測中のCPUにはまだ余裕がありました。
プロセス数が10の場合
スループット:689.0rps
スループットはプロセス1個の場合に比べて1.7倍になりました。
負荷計測中のcpuはidleが0%になっています。
プロセス数が20の場合
スループット:682.5rps
プロセス10個の時点でCPUが頭打ちしてるので、プロセスを20個にしてもスループットは伸びません。
CPU×4
virtualboxの設定画面からプロセッサー数を1から4に変更します。
プロセス数が1の場合
スループット:431.4rps
プロセス1つの場合、CPUが増えてもスループットはほとんど変わりません。
負荷計測中のCPUにはまだ余裕がありました。
プロセス数が10の場合
スループット:1242.9rps
CPUが1つの時に比べて倍近くのスループットになりました。
CPUにはまだ幾分余裕があるように見えます。
プロセス数が20の場合
スループット:1147.5rps
プロセス10個に比べてスループットが少し下がっています。
CPUはまだ余ってそうですが・・・
実はこれVirtualBoxの動くホストマシンのCPUが限界になってます。
このように負荷を与えられる側だけでなく、負荷を与える側のリソースにも注意が必要です。
サービスで負荷試験を実施する際にはこのようなことが無いよう、1台で無理なら複数のサーバーのjmeterから負荷を掛けましょう。
jmeter-serverを使えば複数台のサーバーを使った負荷試験をしやすいのでおすすめです。
まとめ
計測した6パターンのスループット(rps)を表にまとめました。
CPU | Apacheのプロセス数 | ||
---|---|---|---|
1 | 10 | 20 | |
1 | 406.7 | 689.0 | 682.5 |
4 | 431.4 | 1242.9 | 1147.5※ |
(※)ホストマシンを分ければもっと数字が上がりそうですが、今回は未計測です。
最初はプロセス数がボトルネックになっていたのが、CPUがボトルネックに変わったのが分かるかと思います。
今回はプロセス数とCPUにフォーカスしましたが、実際にはメモリ、ストレージ、ネットワークなどなど様々な要素が絡んできます。
このようにボトルネックを見つけて対応する力はApacheに限ったことではなく、負荷試験や負荷軽減対策でとても重要になるので、いざ任せられた時に対応できるよう実践するなどして理解を深めておきましょう!
でわでわ。