【apache】MaxClientsの設定を最適化してみる〜チューニング入門

はじめに

apacheのチューニング入門でとりあえずMaxClientsをいじってみる
preforkしか使ったことないので今回はpreforkが対象
MaxClientsはtopコマンドしたときに出てくるhttpdプロセスの数の最大数

目安としてはhttpdがMaxClientsで設定した数まで増えたときにサーバーがいっぱいいっぱいにならないようにするところ

サーバーのスペック確認

計算しやすくするためにとりあえずapacheの子プロセスを1個に制限

# vi /etc/httpd/conf/httpd.conf
・・・
MaxClients      1

1プロセスのメモリ使用量確認

# top
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
・・・ 
4204 apache    20   0  284m  27m 3652 R 62.2  4.5   0:36.52 httpd
・・・

RES列より27mくらいとわかる

メモリ使用量確認

# free
            total		used	   free		shared	  buffers	  cached
Mem:		630888		98280	  532608		540		  4292		31936
-/+ buffers/cache:		62052	  568836
Swap:	   1023996		11612	 1012384
  • /+ buffers/cache:行のfree列より568mくらい空いていることがわかる

MaxClients=1としているので、568m/27m = 約21なのであと20プロセスくらいはいけると予測する

apache benchで実際に試してみる

コマンド例

$ ab -n 100 -c 20 http://192.168.33.20/

この例だと同時に20リクエストして合計100リクエストになるように実行される
今回は合計リクエスト数は100固定で同時接続数をいろいろ試してみた

request/second : 1秒に処理できたリクエスト数
request/time[ms] : 1リクエスト処理するのにかかった時間

同時接続数=10の場合

MaxClientsrequest/secondrequest/time[ms]
104.80208
204.22237
304.54220
404.85206
504.56219
2565.18193
あまり変化なし

同時接続数=20の場合

MaxClientsrequest/secondrequest/time[ms]
105.00199
204.79208
305.06197
405.20192
504.09244
2564.32231
あまり変化なし

同時接続数=30の場合

MaxClientsrequest/secondrequest/time[ms]
104.66214
204.65215
302.75363
402.57388
502.32432
2562.46407
MaxClientsが30以上になるとだんだんレスポンスが悪くなってくる

同時接続数=40の場合

MaxClientsrequest/secondrequest/time[ms]
105.42184
204.52221
302.35424
400.851180
500.731378
2560.771300
MaxClientsが40以上になるとさらにレスポンスが悪くなってくる

同時接続数=50の場合

MaxClientsrequest/secondrequest/time[ms]
104.81207
205.22191
302.47404
400.781284
500.432337
2560.432337
MaxClientsが50以上になるとだいぶレスポンスが悪くなる

だいたい予想どおりの結果になったかな

さいごに

もちろんサーバーによるけど、今回はvagrantでローカルPCでCentosで実験した。
apacheのデフォルトが256なのでサーバーがしょぼくてアクセスが大量のサイトだと差が出そうなので最適化してみるのもいいかも

以上です