web-dev-qa-db-ja.com

ApacheがCPUを使いすぎる

月に約1億ページビューを受信するサイトのネットワーク用にAmazonのサーバーを管理しようとしています。残念ながら、5人の開発者からなる私のチームのうち、サーバー管理の経験が豊富な人は誰もいません。

現在、MaxClientsは1400に設定されています。現在、トラフィックはほぼ平均であり、合計1150のApacheプロセスが実行されており、それぞれ約2%のCPUを使用しています。それらの1150のうち、800は現在スリープしていますが、まだCPUを使用しています。これを最適化する方法があると確信しています。私はいくつかの考えを持っています:

  1. Apacheは、接続ごとに新しいプロセスを作成しているようです。これは正常ですか?
  2. スリープ状態のプロセスをより迅速に強制終了する方法はありますか?
  3. キープアライブをオンにする必要がありますか?各ページには、約15〜20の中サイズのグラフィックと多くのjavascript/cssが読み込まれます。

これがApacheのセットアップです。できるだけ早くサーバー管理者と契約する予定ですが、誰かが見つかるまでアドバイスをいただければ幸いです。

Timeout 25
KeepAlive Off
MaxKeepAliveRequests 200
KeepAliveTimeout 5

<IfModule prefork.c>
StartServers         100
MinSpareServers      20
MaxSpareServers      50
ServerLimit          1400
MaxClients           1400
MaxRequestsPerChild  5000
</IfModule>

<IfModule worker.c>
StartServers         4
MaxClients           400
MinSpareThreads      25
MaxSpareThreads      75
ThreadsPerChild      25
MaxRequestsPerChild  0
</IfModule>

フルトップ出力:

top - 23:44:36 up 1 day,  6:43,  4 users,  load average: 379.14, 379.17, 377.22
Tasks: 1153 total, 379 running, 774 sleeping,   0 stopped,   0 zombie
Cpu(s): 71.9%us, 26.2%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  1.9%si,  0.0%st
Mem:  70343000k total, 23768448k used, 46574552k free,   527376k buffers
Swap:        0k total,        0k used,        0k free, 10054596k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1756 mysql     20   0 10.2g 1.8g 5256 S 19.8  2.7 904:41.13 mysqld
21515 Apache    20   0  396m  18m 4512 R  2.1  0.0   0:34.42 httpd
21524 Apache    20   0  396m  18m 4032 R  2.1  0.0   0:32.63 httpd
21544 Apache    20   0  394m  16m 4084 R  2.1  0.0   0:36.38 httpd
21643 Apache    20   0  396m  18m 4360 R  2.1  0.0   0:34.20 httpd
21817 Apache    20   0  396m  17m 4064 R  2.1  0.0   0:38.22 httpd
22134 Apache    20   0  395m  17m 4584 R  2.1  0.0   0:35.62 httpd
22211 Apache    20   0  397m  18m 4104 R  2.1  0.0   0:29.91 httpd
22267 Apache    20   0  396m  18m 4636 R  2.1  0.0   0:35.29 httpd
22334 Apache    20   0  397m  18m 4096 R  2.1  0.0   0:34.86 httpd
22549 Apache    20   0  395m  17m 4056 R  2.1  0.0   0:31.01 httpd
22612 Apache    20   0  397m  19m 4152 R  2.1  0.0   0:34.34 httpd
22721 Apache    20   0  396m  18m 4060 R  2.1  0.0   0:32.76 httpd
22932 Apache    20   0  396m  17m 4020 R  2.1  0.0   0:37.34 httpd
22933 Apache    20   0  396m  18m 4060 R  2.1  0.0   0:34.77 httpd
22949 Apache    20   0  396m  18m 4060 R  2.1  0.0   0:34.61 httpd
22956 Apache    20   0  402m  24m 4072 R  2.1  0.0   0:41.45 httpd
3
andrewtweber

Preforkmpmを使用しているように見えます。この答えのほとんどは同じくらい仮定します。

Apacheは、接続ごとに新しいプロセスを作成しているようです。これは正常ですか?

プレフォーク用?はい。

スリープ状態のプロセスをより迅速に強制終了する方法はありますか?

これらのプロセスは何もしていませんか? MaxSpareSevers設定では、最大50のアイドルプロセスのみが必要です。 mod_statusを有効にし、ExtendedStatusをオンに設定すると、Apacheスコアボードを表示し、何が起こっているかを確認できるようになります。

キープアライブをオンにする必要がありますか?各ページには、約15〜20の中サイズのグラフィックと多くのjavascript/cssが読み込まれます。

キープアライブをオンにすることをお勧めします。これにより、クライアントはリクエストをパイプライン処理でき、Apacheプロセスをより効率的に再利用できます。

ほとんどのチューニングと同じように。最初に測定してベースラインを作成し、次に1つを変更してから再測定して、変更した効果がどのようなものであったかを判断します。 mod_statusの使用(およびグラフ化)はこれに便利です。

パフォーマンスに役立つ傾向があるワーカーmpmを使用できる場合があります。ただし、一部のライブラリ(特に一部のPHPライブラリ)は、ワーカーmpmでは正常に動作しません。YMMV

使用しているmpmを判別するには、次のコマンドを実行します。Apache2-V(またはディストリビューションによってはhttpd -V)

3
agy

このトピックについて書かれた本は全部ありますが、簡単にするために:

別の層でデータベースを実行する

データベースのワークロードとWebサーバーのワークロードは完全に異なり、競合する方法でリソースをスラッシングします。それらを分離しておくのが最善です。これは、将来的にスケールアウトするのに役立ちます。

静的コンテンツと動的コンテンツを分離する

静的コンテンツ用にnginxのような高速なウェブサーバーを実行し、Apacheを完全に廃止することを検討してください。可能であれば、どこでもnginxを実行してください。

キープアライブは間違いなく役立ちます

接続の切断と切断によって、多くのリソースが消費されています。

PageTest

より良いアドバイスについては、私は強くお勧めします: http://www.webpagetest.org/ 。これにより、サイトの読み込みに時間がかかる理由がわかり、パフォーマンスを修正するためのベストプラクティスのヒントがいくつかあります。gzip圧縮の有効化、javascriptとcssの縮小などです。ぜひお読みください。

4