web-dev-qa-db-ja.com

Apache起動サーバー、最小/最大スペアサーバーRAM消費の影響

私は1GBのRAMVPSを持っています。 Apacheを停止すると、400mbのRAMが解放されます。したがって、最大クライアントは(合計RAM-使用RAM)/ max_service_ram_consumption = 400/31である必要があります。したがって、MaxClientsは13である必要があります。

これらは定義です:

StartServers: number of server processes to start
MinSpareServers: minimum number of server processes which are kept spare
MaxSpareServers: maximum number of server processes which are kept spare
ServerLimit: maximum value for MaxClients for the lifetime of the server
MaxClients: maximum number of server processes allowed to start
MaxRequestsPerChild: maximum number of requests a server process serves

Prefork(Apacheのデフォルト)を使用しています。

私の設定はこれです:

Timeout 30
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 2

<IfModule mpm_prefork_module>
    StartServers          3
    MinSpareServers       3
    MaxSpareServers       10
    ServerLimit           50
    MaxClients            50
    MaxRequestsPerChild   1000
</IfModule>

StartServersとMinSpareServersのデフォルト値は5でした。3に変更しました。メモリ消費量に違いは見られません。また、MaxClientsを150から50に変更しました。また、MaxRequestsPerChildを1000に制限しました(デフォルトは0-無制限)。

StartServers、MinSpareServers、MaxSpareServersがRAMの消費にどのように影響するか教えてください。そして、なぜ低い/高い値を持つことが良い/間違っているのか。これらの値がパフォーマンスにも影響することを私は知っています。しかし、私はどこにも良いApacheRAM消費計算機を見つけることができません。

最大ユーザー数が約50/100になるようにApache.confを構成するにはどうすればよいですか?

2
Pascut

あなたは正しい方向に進んでいます。残りの詳細を理解するのに役立ついくつかのことがあります。

Mod_statusによって提供されるすべての統計でApacheの詳細な監視が必要です

  • "_"接続を待機中
  • 「S」起動
  • 「R」読書リクエスト
  • 「W」返信
  • 「K」キープアライブ(読み取り)
  • 「D」DNSルックアップ
  • 「C」接続を閉じる
  • 「L」ロギング
  • 「G」優雅に仕上げる
  • 「私」労働者のアイドルクリーンアップ
  • 「。」現在のプロセスなしでスロットを開く

すべてをチェックすると、メモリは常に不足していますVMプロバイダーは基本的に、取得するメモリのサイズに基づいてVM価格を請求します。したがって、使用するときは注意してください。

ServerLimit(再定義するにはApacheの停止/開始が必要)を定義してから、MaxClients(再起動で調整可能)を使用して、サーバーが処理できる最大値を設定できます。これらの値は、サーバーのリソースを使い果たすためにインターネットから誰かを保護するためにあります。計算した場合、13のスレッドを持つことができます。 13です。

一定期間の使用パターンを確認し、StartServerを平均使用量になるように調整します。したがって、平均的な使用量に近いものから始めます。また、Webサーバーがより多くのリクエストを処理する必要がある場合は、さらに数人のワーカーが起動します。それらのボリュームは、MaxClientsのceil値によって制御されます。

  • MinSpareServers
  • MaxSpareServers

したがって、トラフィックの増加が少ない場合は、すぐに大量のワーカーをスピンアップさせたくありません。おそらく使用されないであろう追加のワーカーの束でメモリを浪費することを避けるために、ワーカーを1つか2つスピンアップしたいと思うでしょう。生成されたプロセスが破棄されるまでにはMaxRequestsPerChildが必要です。その後、使用状況に基づいて、Apacheは古いワーカーを置き換えるために新しいプロセスを開始する必要があるかどうかを判断します。

MaxRequestsPerChildに関しては、ここでは0を避けたいと思います。パフォーマンスのためにメモリにキャッシュしておくことをお勧めしますが、そのためのメモリはありません。ここで1000や2000のような数値を小さくすると、デフォルトの10000よりも適切なオプションになる可能性があります。これは、HTTPリクエストの処理数を減らした後にワーカーをリサイクルすると、メモリ使用量の点で徐々に増加するライフタイムが制限されるためです。したがって、これらを後でではなく早くリサイクルすると、メモリを節約できます。

ユーザー数については、それは...あなたのユーザーが一日中うまくウェブサーバーにアクセスするのか、それとも全員が同時にウェブサーバーを必要とするのかによって異なります。物事をより良くするための一般的なレシピがないため、物事をよりスムーズに実行する方法を考え出すときは、メモリ、Apache、CPU使用率、およびその他のシステムヘルスの数値を監視(グラフなど)する必要があります。それはユースケースと使用パターンに大きく依存します。

Apacheのメモリ使用量に関しては、これは難しい問題です。各Apacheスレッドは、メモリの特定の部分にアクセスできます。このアクセス可能なアドレス空間は、この特定のプロセスに固有の部分がありますが、アドレス空間の他の部分は他のApacheスレッドと共有されます。したがって、それらすべてがどれだけ使用するかを計算するときは、同じアドレス空間を2回考慮しないようにする必要があります。

これがApacheメモリフットプリントを計算するための私のアプローチです。ディストリビューションによっては、Apacheプロセス「httpd」「Apache2」など、今は考えられない名前があるため、Apacheのプロセス名に合わせて最初の行を変更する必要があります。

cmd='httpd'
ps -o size=,rss=,vsz= $(pgrep "$cmd") | awk '
  { size_sum += $1; rss_sum += $2; vsz_sum += $3; processes += 1 } 
  END {
    printf "Size  : %.2f (%.2f) MB\n",size_sum/1024,size_sum/1024/processes
    printf "RSS   : %.2f (%.2f) MB\n",rss_sum/1024,rss_sum/1024/processes
    printf "VSZ   : %.2f (%.2f) MB\n",vsz_sum/1024,vsz_sum/1024/processes
  }'

出力は次のようになります

Size  : 178.84 (16.26) MB
RSS   : 118.08 (10.73) MB
VSZ   : 1754.29 (159.48) MB

これは私のWebサーバーの1つからのものです。各行の最初の値は合計で、括弧内の2番目の値はプロセスごとの平均です。値を説明するために、psのmanページを引用します

  • Size:プロセスがすべての書き込み可能なページをダーティしてからスワップアウトする場合に必要となるスワップスペースのおおよその量。この数は非常に大まかなです!
  • [〜#〜] rss [〜#〜]:常駐セットサイズ、タスクが使用したスワップされていない物理メモリ
  • [〜#〜] vsz [〜#〜]:プロセスの仮想メモリサイズ

これがあなたの数学にとって意味することは;プロセスは潜在的にVSZサイズに成長する可能性があり、現在、MaxClients /を計算しようとするときに方程式で使用する数値であるRAMのRSSを使用しています。 ServerLimitとSIZEは、理論的には、アイドル状態のために完全にスワップされた場合にプロセスが取る可能性のあるサイズです。トピックに関するいくつかの sources は、

ps -ef | grep httpd | grep -v ^root | awk '{ print $2 '} | xargs pmap -d | grep ^mapped: | awk '{ print $4 }' | cut -dK -f1 | awk '{ SUM += $1} END { print SUM/NR }'

これは、前に計算したSIZEと同じ値を返すはずです。

2
Hrvoje Špoljar