Unix Webサーバーのメモリ使用量を削減する方法


36

現在、Joyent Acceleratorを使用してwebappをホストしていますが、うまく機能していますが、コストを削減する必要があるため、現在のプランをダウングレードし、新しいメモリ制限(256M rss、512Mスワップ)を課しています。昨日はあまり気になりませんでしたが、今日数回Apacheを再起動した後、現在411M rss、721Mスワップ(prstat -Z -s cpu)です。

サーバーフォールトで検索すると、サーバーを監視するための多くの方法と特定のツールしか提供されませんが、メモリ使用量を削減/最適化する方法に関するアドバイスはありません。私もこの質問を見てきましたが、この特定の(またはジェネリックと言ってもよいでしょう)状況には良いとは思いません。

サーバーは共有CPU上でSolarisを実行しており、Apache + MySQL + PHPスタックを使用しています。

これをトラブルシューティングして問題を解決するために実行できる手順を知りたいです。しかし、私はまた、現在の終了前に記憶フットプリントを下げて計画をダウングレードするために時間を使い果たしているので、魔法を作り、日を節約できるものも歓迎です:)


1
私はグーグルからこれらの設定について自分で学んだが、1つのファイルの設定を変更していることが判明したが、後でロードされている別の設定ファイルが実際に設定を静かに上書きしていることをコメントしたいだけです!それを発見した後、prefork MPM設定と他のいくつかの設定を行うと、プロセス数とメモリ使用量を制御し、最小限にスワップすることができます。この情報が他の人、特にサーバーでGentooを実行している人に役立つことを願っています。
ピスト

回答:


23

回答ありがとうございます!あなたの提案に従って、コードに触れることなく、メモリ使用量を195M SWAPと108M RSSに減らすことができました(すぐに最適化することは間違いありませんが、これはトラブルから迅速に抜け出すための解決策となるはずでした)。

これが私がしたことのリストです:

VirtualHostエントリで使用されるワイルドカードを取り除きました。*:80および*:443の代わりに、サーバーの実際のIPを使用しました。

ApacheのプリフォークMPMを変更しました。これらは私が最終的に使用した値です:

StartServers 1
MinSpareServers 1 
MaxSpareServers 5 
ServerLimit 16
MaxClients 16
MaxRequestsPerChild 0
ListenBacklog 100

これらは決して魔法の数字ではありません。さまざまな値と組み合わせを試してみてから、サーバーの実際の使用状況に対してテストしました。誰もが同じ環境で同じことをする必要があります。記録のために、私のサーバーは毎月2M pvsを受け取り、動的なページとアセットの両方を通常のレートで提供します-digg効果はありません。ここでも、パフォーマンスやHAを改善するのではなく、メモリフットプリントを削減することを目的としています。

参照:

ApacheのKeepAliveを調整しました。KeepAliveTimeoutより低い値(私の場合は2)に設定することで、コンテンツを要求しないアイドルクライアントとの接続を待機するサーバープロセスが減ることが期待できます。

リファレンス:http : //httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout

MySQLの未使用モジュールを削除しました。skip-innodbMySQLのmy.cnf に追加しました。大幅なメモリ消費の削減。


個人的にはできなかったいくつかの注目すべき優れた提案もあります。

  • 不要なPHPモジュールを削除します。私のサーバー上のPHPにはほとんどのMODが既にコンパイルされています。おそらく、他のVPSで最小限のPHPを試してみるでしょう。
  • php-fastcgiを使用してnginxに切り替えます。それはもうすぐ試してみるもう一つの良いアドバイスですが、今はダウンタイムを冒すことはできません。

私はnginxとphp-fastcgi(LEMP)を実行していて、同様のメモリの問題に直面しています...ポイント!
ファリンスペース

Got rid of the wildcard used in VirtualHost entriesそれは実際に何らかの有意義な方法で役立ちますか?私は違いをもたらさないだろうという印象を受けていました。
マーン

@Mahn -それはメモリとの助けにはならないが、それは、低メモリ環境では良いことですが、CPU使用率、改善
jsnfwlr

「php-fastcgiを使用したnginxへの切り替え」--- Apache2を維持したい場合は、Apache2 + mod_proxy_fcgi + mod_mpm_eventのようにあまり効果的ではないオプションを使用します。mpm_eventはnginxに似ています。それを使用してphp-fpmに接続します。dracony.org/stop-using-php-fpm-to-argue-using-nginx-vs-apacheを
ジェームズジョンストン


4

実行するApacheサーバープロセスの数を制限する必要があります。また、制限に近づいているため、ピークの多いトラフィックを処理することはできません。通常、使用量が最大になっているWebサーバーを使用するのは悪い考え(tm)です。これは、Webトラフィックは、ほとんどの場合、スラッシュドットや掘り出し、火の玉などが出るまでは良好で低いためです。

主な問題は、任意の時点で実行されているApacheプロセスの数です。PHPアプリケーションのみをデプロイしており、PHPはスレッドセーフではないため、ここでプリフォークを想定しています。私はワーカーMPMのディメンションを作成した経験がありません。共有メモリにあるアイテムと、各プロセスのメモリにあるアイテムがあります。

不要な共有モジュールを除外することで、総メモリフットプリントを削減できます。基本的に、Apacheはほとんどすべてのホストから構成されており、ほぼすべての処理を実行できます。mod_userdirを使用していない場合は、Apache設定からコメントアウトします。必要なものや依存関係の一部は直感的ではないため、どれだけ削除するかに注意してください!すべてのモジュールは、apache.org Webサイトで文書化する必要があります。プロセスごとのフットプリントを小さくすることは困難です。最近のほとんどのApache構成には、4つの必須モジュールのみがコンパイルされています。これらの4つのモジュールを超えると、メモリ使用量のほとんどは、リークまたは効果的にガーベジコレクションされないアプリケーションRAMのいずれかから発生するため、リクエスト数を設定する必要がある場合があります各プロセスで処理されます。

あなたは本当に RAM自体にあなたのメモリ使用量を維持したいとスワップに入りません。スワップとはI / Oを意味します。I / Oは低速であり、スワップからシャッフルされるものを待っている間にプロセスがブロックするため、CPU使用率が屋根を通り過ぎます。


1
カールのアドバイスをありがとう!サーバーがスワップを使用しないようにする方法はありますか?メモリ使用量を減らした後、RAMを使い果たしていないのに、SWAPメモリが使用されていることを示しているためです。
リマ

@fandelostスワップが使用されているかどうかは実際には関係ありません。スワップがページインおよびスワップアウトされているときに問題が発生します。お使いのオペレーティングシステムは、実行する時間があまりないときに、頻繁に実行されていないプロセスから命令やデータを交換している可能性があります。
パトリックジェームズマクドゥーグル

2

Apacheの場合、使用しないモジュールは削除してください。追加のメモリを使用するだけです。MySQLの場合、innodb / bbdbを使用しない場合は削除し、不要なPHPモジュールを削除します。

次に、1つのプロセスのサイズとApacheに与えたいメモリ量に基づいてApache MaxClientsを設定する必要があります。MySQLの最大接続についても同様です(優れたMySQL Tuning Primerスクリプトをお勧めします

PHPアプリを制御できる場合は、メモリを過度に使用しないようにしてください(変数、特に静的なメモリなど)。

さらに先に進みたい場合は、apache + mod_phpをnginx + fcgiセットアップに置き換えることができます。これにより、メモリがさらに削減される可能性があります。

最後にもう1つ-あなたは本当にWebサーバーでスワップしたくないのです。少しだけ、不要なものを削除しますが、Webサーバーで定期的にスワップすると、Webサイトが応答しなくなります。


あなたのアドバイスをありがとう、yhager、私はtuning-primer.shを試していますが、次のエラーが表示されます:「94行目の構文エラー: `cnf_socket = $ 'unexpected」。何か案は?
リマ

シェルに関連している可能性があります。このスクリプトはおそらくLinux関連であるため、最初の行を/ bin / shではなくbashを指すように変更してみてください。...私はあなたがbashのは、Solarisにインストールされますことを願って、私はそれに役立つことはできません
yhager

2

あなたはすでに目標を達成しているので、ここにいくつかの追加があります

不要なphpモジュールをすべて削除したので、apacheでも同じことができます。デフォルトでは(インストールに応じて)、apacheは非常に多くの追加モジュールをロードし、それらのほとんどは通常の日常の使用には実際には必要ありません。たとえば、常にロードされる認証モジュールの束があります。帯域幅の使用を制限しようとしない限り、通常、deflateは必要ありません。自動インデックスとステータスも問題です。

もう1つは、php.iniでphpが使用できるメモリの量を制限できることです:memory_limit = xxxM


0

もちろん、apacheがforkできるプロセスの数を制限できますが、これはメモリ使用量のsudo-hard制限としてのみ機能します。下位レベルの観点から、plimitを使用して、プロセスで使用可能なリソースを制限できます。これを継承する親プロセスと子プロセスに適用すると信じています。

ただし、Webサーバーの構成の観点からは、コードの実際の実行方法に帰着することができます。ただし、.htaccessファイルを使用するなどの小さなことは、中央のapache構成ファイルを使用するよりも多くのリソースを使用することに注意してください(要求が来るたびに読み取られるため、オーバーヘッドが大きくなります)。


0

時間の経過に伴うメモリの増加に役立つ可能性のあることの1つは、httpdキープアライブを低く設定することです。


0

サーバーは共有CPU上でSolarisを実行しており、Apache + MySQL + PHPスタックを使用しています。

Solarisの経験はありませんが、Apache / mod_phpを使用しないのが最善です。

  • php-fastcgiを使用してnginxに切り替えます。
  • 最小限のプラグインを使用するようにphpを再コンパイルします。
  • ntpd(ntpdateを使用)、ftp(scpを使用)などの不要なプロセスを取り除きます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.