私は現在、プリフォークメモリモデルで実行されている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)があり、専用のクアッドコアサーバーです。
この問題の解決にご協力いただき、ありがとうございます。
まず、メモリ使用量の決定について。 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時間の価値があります。
Psがすべてのプロセスがそのようであると言う理由もあります..すべてのプロセスがそれほど多くのメモリを使用しているわけではありません..psとメモリについての良い読み物については以下を参照してください
http://virtualthreads.blogspot.com/2006/02/understanding-memory-usage-on-linux.html