現在、Apache/2.4.23バージョンを使用しており、ELBの背後にあるWebサーバーで複数の仮想ホストサイトを実行しています。 ELBの下に4つのインスタンスがあり、それぞれに合計8GBのRAMがあります。これらのWebサーバーでは、httpd.confファイルにmpmディレクティブが設定されていませんが、httpd-mpm.confファイル(/usr/share/doc/httpd24-2.4)にmpmモジュールディレクティブのデフォルト値が表示されています。 .23)。私のウェブサーバーはpreforkmpmモジュールを使用しています
httpd -V | grep MPM
Server MPM: prefork
現在、4つのWebサーバーすべてに8GBから約200MBの空き領域しか残っておらず、常に約60のhttpdプロセスが実行されていることがわかります。以下はメトリックです
[root@ip ~]# ps -ef | grep httpd | wc -l
58
[root@ip ~]# ps -ylC httpd | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Proccess Size (MB): "x/((y-1)*1024)}'
Apache Memory Usage (MB): 1640.18
Average Proccess Size (MB): 38.1438
[root@ip ~]# free -m
total used free shared buffers cached
Mem: 7986 7755 231 51 114 233
-/+ buffers/cache: 7407 579
Swap: 0 0 0
サーバーのパフォーマンスを向上させるために、httpd.confファイルを以下のpreforkmpmディレクティブで更新することを計画しています。変更したいのは、MaxRequestWorkersの値を250から400に変更することだけです。
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
編集:以下はhttpd-mpm.confファイルのデフォルト設定です。しかし、httpd.confファイルにprefork mpmモジュールの設定が表示されないため、Webサーバーがデフォルト値を下回っていると想定しています。
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
以下はトップ出力です:
top - 13:26:31 up 21:08, 1 user, load average: 0.27, 0.17, 0.12
Tasks: 201 total, 1 running, 199 sleeping, 0 stopped, 1 zombie
Cpu(s): 0.7%us, 0.3%sy, 0.0%ni, 98.3%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8178632k total, 7985364k used, 193268k free, 113336k buffers
Swap: 0k total, 0k used, 0k free, 189448k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
26918 Apache 20 0 764m 53m 39m S 0.0 0.7 0:01.65 httpd
24963 Apache 20 0 769m 50m 36m S 0.3 0.6 0:01.39 httpd
26026 Apache 20 0 769m 49m 34m S 0.0 0.6 0:00.81 httpd
26116 Apache 20 0 769m 47m 32m S 0.0 0.6 0:01.06 httpd
25766 Apache 20 0 769m 47m 32m S 0.0 0.6 0:00.95 httpd
27620 Apache 20 0 769m 47m 32m S 0.0 0.6 0:00.47 httpd
26548 Apache 20 0 769m 47m 32m S 0.0 0.6 0:00.66 httpd
27128 Apache 20 0 769m 46m 32m S 0.0 0.6 0:01.16 httpd
28247 Apache 20 0 769m 46m 31m S 0.0 0.6 0:00.24 httpd
27670 Apache 20 0 769m 46m 31m S 0.0 0.6 0:00.32 httpd
27424 Apache 20 0 769m 46m 31m S 0.0 0.6 0:00.41 httpd
24378 Apache 20 0 763m 46m 33m S 0.0 0.6 0:01.28 httpd
26800 Apache 20 0 763m 45m 32m S 0.0 0.6 0:00.75 httpd
27672 Apache 20 0 763m 45m 31m S 0.0 0.6 0:00.53 httpd
26614 Apache 20 0 762m 45m 33m S 0.0 0.6 0:00.88 httpd
25098 Apache 20 0 762m 44m 32m S 0.0 0.6 0:01.20 httpd
26671 Apache 20 0 763m 44m 31m S 0.0 0.6 0:00.64 httpd
27635 Apache 20 0 763m 44m 31m S 0.0 0.6 0:00.61 httpd
23499 Apache 20 0 763m 43m 29m S 0.0 0.5 0:01.77 httpd
26285 Apache 20 0 767m 43m 29m S 0.3 0.5 0:00.70 httpd
27868 Apache 20 0 761m 42m 31m S 0.3 0.5 0:00.70 httpd
26444 Apache 20 0 763m 42m 29m S 0.0 0.5 0:00.73 httpd
26081 Apache 20 0 763m 42m 29m S 0.0 0.5 0:00.68 httpd
25467 Apache 20 0 763m 42m 29m S 0.0 0.5 0:00.99 httpd
26412 Apache 20 0 763m 42m 28m S 0.0 0.5 0:00.53 httpd
27412 Apache 20 0 763m 42m 29m S 0.0 0.5 0:00.45 httpd
26720 Apache 20 0 763m 42m 29m S 0.0 0.5 0:00.51 httpd
26179 Apache 20 0 763m 42m 29m S 0.0 0.5 0:00.59 httpd
25943 Apache 20 0 763m 42m 29m S 0.0 0.5 0:00.78 httpd
27570 Apache 20 0 763m 42m 28m S 0.0 0.5 0:00.28 httpd
26721 Apache 20 0 763m 42m 28m S 0.0 0.5 0:00.46 httpd
27252 Apache 20 0 763m 42m 28m S 0.0 0.5 0:00.54 httpd
27408 Apache 20 0 763m 42m 28m S 0.0 0.5 0:00.29 httpd
27612 Apache 20 0 763m 42m 28m S 0.0 0.5 0:00.36 httpd
27576 Apache 20 0 763m 42m 28m S 0.0 0.5 0:00.28 httpd
27668 Apache 20 0 883m 41m 28m S 0.0 0.5 0:00.31 httpd
27626 Apache 20 0 763m 41m 28m S 0.0 0.5 0:00.32 httpd
私の質問は、この変更により、Webサーバーが使用するシステムメモリが少なくなり、負荷を効率的に処理できるようになるかどうかです。 そして、私のWebサーバーの空き容量が少ないため、MaxRequestWorkersの値を250から400に変更すると、さらに問題が発生します?サーバーのメモリ消費を最適化するためのより良い解決策はありますか?
なぜあなたが労働者よりもプリフォークを選ぶのか分かりません。すでにApache/2.4.23を使用しているため。参照: ここでのこの回答はworkerの使用を推奨します 、また、メモリと並行性がはるかに効率的です。
労働者
mpm_workerはスレッド化を使用します-これは並行性の大きな助けになります。ワーカーはいくつかの子プロセスをスピンオフし、次に子プロセスをスピンオフします。プリフォークと同様に、一部のスペアスレッドは、着信接続を処理するために、可能であれば準備ができています。スレッド数は、プリフォークのサーバー数のようにメモリ使用量に直接関係しないため、このアプローチはRAMではるかに親切です。また、接続はpreforkのスペアサーバーではなく、空きスレッド(通常は利用可能)を待つだけでよいため、同時実行をはるかに簡単に処理できます。
PS。ポイントが足りないためコメントできませんでした。