web-dev-qa-db-ja.com

プロセスごとに1000MBのメモリを使用するプリフォークモデルを備えたApache

私は現在、プリフォークメモリモデルで実行されているApacheを使用するサイトで作業しています。以下はhttpd.confからの設定です

<IfModule prefork.c> 
  StartServers            30
  MinSpareServers         15
  MaxSpareServers         30
  MaxClients              96 
  ServerLimit             512
  MaxRequestsPerChild     0
</IfModule>

以下は上からのサンプルラインです

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
29261 Apache    15   0 1003m 231m  53m S 16.3  2.9   1:47.68 httpd              

ロードされたApacheモジュールは次のとおりです

core prefork http_core mod_so mod_auth_basic mod_authn_file 
mod_authz_Host mod_authz_user mod_include mod_log_config 
mod_logio mod_env mod_ext_filter mod_mime_magic mod_expires 
mod_deflate mod_headers mod_usertrack mod_setenvif mod_mime 
mod_status mod_autoindex mod_info mod_vhost_alias mod_negotiation 
mod_dir mod_actions mod_alias mod_rewrite mod_cgi mod_version 
mod_realip2 mod_php5 mod_ssl

これらのモジュールがすべて使用されているかどうかはわかりません。

以下はロードされたphp拡張機能です

date, libxml, openssl, pcre, zlib, bz2, calendar, ctype, 
curl, hash, filter, ftp, gettext, gmp, session, iconv, 
posix, Reflection, standard, shmop, SimpleXML, SPL, sockets, 
exif, sysvmsg, sysvsem, sysvshm, tokenizer, wddx, xml, 
Apache2handler, memcache, uploadprogress, dbase, dom, 
eAccelerator, Gd, json, mbstring, mcrypt, memcached, mongo, 
mysql, mysqli, newrelic, PDO, pdo_mysql, pdo_sqlite, xmlreader, 
xmlwriter, xsl, Zip

Apacheがプロセスごとにこれほど多くのメモリを使用するのはなぜですか? tiはこれらのモジュールのせいですか?もしそうなら、それらが使用されているかどうかを確認するために私が見始めることができるメモリホッグがそこにありますか?それとも、php拡張機能が原因でしょうか?そこにメモリホッグはありますか?

PHPのメモリ制限は256MBに設定されています。

アクセラレータは512MBのメモリで構成されています。

トラフィックが増加するとすぐにスワップの使用が開始され、システムが応答しなくなるため、サーバーは平均をわずかに超える負荷を処理することもできません。サーバーには合計8GBのRAM)があり、専用のクアッドコアサーバーです。

この問題の解決にご協力いただき、ありがとうございます。

2
anoopjohn

まず、メモリ使用量の決定について。 VSS/VSIZE/VIRTは、プロセスによるRAMの実際の使用量ではありません(@psusiも指摘))。実際の使用量を計算できるツールがいくつかあり、1つは非常に役立ちます。 Yahoo!のPeterWillisによるツール:

http://psydev.syw4e.info/new/misc/meminfo.pl

構成に関する2つの重要な注意事項。通常、以下を使用することはお勧めできません。

MaxRequestsPerChild     0

自分でアプリケーションを作成しない限り。メモリリークが発生することはかなり一般的であるため、数百(または数千)の要求の後、子のメモリ使用量は増加し、最終的には妥当なレベルを超えます。おそらくこれを約200に設定し、200回のリクエスト後に使用されるメモリ量を確認する必要があります。これは、サーバーのスポーンにかかる時間と比較検討する必要があります。新しい子をフォークするのに数秒と多くのリソースがかかる場合は、値を増やします(または、軽量の場合は減らします)。

次に、スレッドセーフでないモジュールを特に使用している場合を除いて、プリフォークはより多くのメモリを使用するため、実際には好ましくありません。

http://httpd.Apache.org/docs/2.0/misc/perf-tuning.html#compiletime

プリフォークMPMは、それぞれ1つのスレッドを持つ複数の子プロセスを使用します。各プロセスは、一度に1つの接続を処理します。多くのシステムでは、プリフォークの速度はワーカーに匹敵しますが、より多くのメモリを使用します。

最後に、不要なモジュールを調べて削除することをお勧めします。私の知る限り、これを行うのに役立つカスタムモジュールはなく、通常はできるだけ多くを削除して、システムが引き続き機能することを確認しようとします。これは基本的に推測とチェックですが、実行にかかる時間は1〜2時間の価値があります。

3
polynomial

Psがすべてのプロセスがそのようであると言う理由もあります..すべてのプロセスがそれほど多くのメモリを使用しているわけではありません..psとメモリについての良い読み物については以下を参照してください

http://virtualthreads.blogspot.com/2006/02/understanding-memory-usage-on-linux.html

2
Mike