web-dev-qa-db-ja.com

ApacheはRAMの2GBを消費します

12.0.4 ubuntuを実行している1GB VPSサーバーがあります。すべてがうまく機能します。ほとんどの場合、私のRAMの使用量は約700 MBです。ただし、毎週またはランダムにServerがメモリ不足になり、クラッシュします。 Mysqlを除くすべてのサービスを回復して開始します。

スワップメモリ​​がないことがわかったので、256MBのスワップファイルを作成して構成します。正常に動作しますが、今回は2週間後にクラッシュします。

あなたはすでにそれを理解しているので、私は専門家ではありません。したがって、通常の操作でサーバーが大量のメモリを消費する理由についてのガイダンスが必要です。私は別の時間にそれを観察することを意味します、それは常に約700-800MBのメモリであり、負荷は安定しています。夜間などに実行されるcronはありません。いくつかのwordpress blogがありますが、安定した負荷があり、「バルク」負荷が発生することはありません。

私はVesta Control Panelを持っています、そして、私が知っているすべてのレポートは正常です。私が気づいたことの1つは、Apacheが常に1900MBのメモリ消費を示していることです。私のシステムでは全体としてメモリが少なくなっています。 nginxをリバースWebサーバーにインストールしました[Vestaがそれをどうしてくれたのかわかりません]。それ以外はすべて良いです。Apacheは常に1900MBです。この使用量が増えると、サーバーがクラッシュするようです。

だから、私はそのApacheの使用を減らすことができる方法はありますか?現在の負荷でサーバーを安定させるために他にすべきことは何ですか。

編集:

ここでの提案に基づいて、私のMPM構成です

<IfModule mpm_prefork_module>
    StartServers          8
    MinSpareServers       5
    MaxSpareServers      20
    ServerLimit         256
    MaxClients          200
    MaxRequestsPerChild 4000
</IfModule>

ここに私のApache2ctl -lがあります

Compiled in modules:
  core.c
  mod_log_config.c
  mod_logio.c
  prefork.c
  http_core.c
  mod_so.c

前にも述べましたが、サーバー上でWordpress(PHP)ベースのブログを実行していますが、他のWebサイトと同じ方法でNginxとApacheを使用して実行するRedmine(Ruby on Rail)もあります。いいえ、私はpythonを使用しません。

3
Sumit Gupta

Apache prefork MPM 256で ServerLimit に設定すると、約256プロセスの最大メモリ使用量に設定しました。通常はそれぞれ約15-30 MBのメモリPHP5 Apacheモジュール。計算を行うと、多数のクライアントを持つ小さなサーバーで爆発することがわかっています。

代わりに、はるかに厳しい制限を設定します。例えば。

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    ServerLimit         25
    MaxClients          20
    MaxRequestsPerChild 4000
</IfModule>

Apacheを再起動して、新しいMPM構成を使用します。

これにより、Apacheが5つのプロセスで起動し、新しい着信クライアント用に5つのプロセスが無料になり、10以上が未使用でハードリミットが25の場合のみプロセスをシャットダウンします。必要に応じて調整します。

または、ApacheモジュールとしてPHPではなく PHP-FPM を使用するオプションを調べてください。これははるかに効率的であり、Ubuntu 14.04のデフォルト設定でもあります。別個のPHPプロセスプールがあり、notApache prefork MPMを使用することに注意してください(正確により効率的である理由)。

これらすべての設定方法については、通常のUbuntu/Apache/PHP-FPMのドキュメントをご覧ください。

5
gertvdijk

1台のサーバーでmysqlとApacheを使用するのは、本当に悪い考えです。ユーザーが多ければ多いほど、データベースへのアクセスも多くなります。データベースももちろんcpuとmemを使用して動作します。したがって、Apacheにクエリとクエリを行うように指示すると、ユーザーはイライラし、ページをリロードし、さらにクエリを追加します。私がどこに向かっているのか知っていますか?あなたの場合、同じまばらなリソースを使用する必要があるのはapaxheだけでなくmysqlでもあります。

鳥を殺すためにApache(キャノン)を使用しないでください(80人のユーザー)。 Go nginx(-npm)は、より軽量で、それほど多くのリソースを消費しません。

ほとんどのpplは、ApacheがPOSSIBLE接続のリソースを要求していることを理解していません(したがって、それを下げるヒントがあります)

このプログラムは、いつでもページを提供するように書かれています。そのため、リソースを(接続がない場合でも表示するために)使用し、それらを維持します。申し訳ありませんが、私は英語を母国語としないので、あなたが理解できる方法で説明できるといいのですが。短いバージョン80ユーザーとApacheは、小さな仮想ホストでは一致しません! nginxを使用します。これにより問題が解決するか、dbを別の小さなサーバーに移動します。

1
s1mmel