web-dev-qa-db-ja.com

Unixウェブサーバーのメモリ使用量を減らす方法

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

サーバー障害を検索しても、サーバーを監視するための多くの方法と特定のツールが提供されますが、サーバーのメモリ使用量を削減/最適化する方法についてのアドバイスはありません。私も この質問 を見てきましたが、この特定の(または一般的なことを言ってもよい)状況に適しているとは思いません。

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

これをトラブルシューティングして問題を解決するために実行できる手順を知りたいです。ただし、現在のメモリフットプリントを減らして計画をダウングレードする時間も足りないので、魔法をかけてその日を節約できるものなら何でも大歓迎です:)

36
lima

回答ありがとうございます!提案に従って、コードに手を加えることなく、メモリ使用量を195Mのスワップと108MのRSSに減らすことができました(まもなく最適化します) 、しかしこれは私を早くトラブルから抜け出すための解決策であるはずでした)。

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

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

Apacheのprefork MPMを変更しました。これらは私が最終的に使用した値です:

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

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

参照:

ApacheのKeepAliveを調整しました。KeepAliveTimeoutを低い値(私の場合は2)に設定することで、待機しているサーバープロセスが少なくなることが期待できます。これ以上コンテンツを要求しない可能性のあるアイドル状態のクライアントとの接続。

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

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


私が個人的に行うことができなかったいくつかの驚くべき良い提案もあります:

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

私は ApacheとMySQLの低メモリ構成に関するこの記事を見つけました

低メモリ構成に必要な構成変更のレイアウトに非常に役立つ。自分の状況に合わせて調整しましたが、環境に最適なツールを見つけるために必要なツールが提供されているはずです

6
Kevin Kuphal

実行中のApacheサーバープロセスの数を制限する必要があり、現在の制限に近づいていると、非常に多くのピークトラフィックを処理できなくなります。 Webトラフィックは、スラッシュドット化、掘り出し、火の玉などになるまで、ほとんどの場合ナイスであり、低いため、通常の使用状況で最大になるWebサーバーを使用することは、一般に悪い考え(tm)です。

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

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

あなた本当にメモリ使用量をRAM自体に保持し、スワップに入らないでください。スワップはI/Oを意味します。I/ Oは低速であり、CPU使用量を増加させます何かがスワップからシャッフルされるのを待つ間、プロセスがブロックするにつれて屋根を通り抜けます。

4
Karl Katzke

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

不要なphpモジュールをすべて削除したので、Apacheでも同じことができます。デフォルトでは(インストールに応じて)Apacheはかなりの量の追加モジュールをロードし、それらのほとんどは通常の日常の使用には実際には必要ありません。たとえば、常に読み込まれる一連の認証モジュールがあります。帯域幅の使用を制限しようとしない限り、通常、deflateは必要ありません。 Autoindexとステータスの移動にも疑問があります。

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

2
rasjani

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

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

PHPアプリを制御している場合は、メモリが多すぎないことを確認してください(例:変数、特に静的メモリ)。

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

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

2
yhager

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

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

  • Php-fastcgiでnginxに切り替えます。
  • 最小限のプラグインを使用するようにphpを再コンパイルします。
  • Ntpd(ntpdateを使用)、ftp(scpを使用)などの不要なプロセスを削除します。
0
Unknown

もちろん、Apacheがフォークできるプロセスの数を制限することもできますが、これはメモリ使用量のSudoハード制限としてのみ機能します。下位レベルの観点からは、 plimit を使用して、プロセスで使用可能なリソースを制限できます。これを親プロセスと子プロセスに適用すると、継承すると思います。

ただし、Webサーバー構成の観点から見ると、コードが実際にどのように実行されるかが問題になります。ただし、.htaccessファイルを使用するような小さなことは、中央のApache構成ファイルを使用するよりも多くのリソースを使用することに注意してください(リクエストが受信されるたびに読み込まれるため、オーバーヘッドが大きくなります)。

0
Coops

時間の経過に伴うメモリの増加に役立つ可能性があることの1つは、httpdキープアライブを低く設定することですが、アプリケーションでより長期間のプロセスが必要な場合に備えて、慎重にテストします。

0
D.F.