月に約1億ページビューを受信するサイトのネットワーク用にAmazonのサーバーを管理しようとしています。残念ながら、5人の開発者からなる私のチームのうち、サーバー管理の経験が豊富な人は誰もいません。
現在、MaxClientsは1400に設定されています。現在、トラフィックはほぼ平均であり、合計1150のApacheプロセスが実行されており、それぞれ約2%のCPUを使用しています。それらの1150のうち、800は現在スリープしていますが、まだCPUを使用しています。これを最適化する方法があると確信しています。私はいくつかの考えを持っています:
これが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
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)
このトピックについて書かれた本は全部ありますが、簡単にするために:
データベースのワークロードとWebサーバーのワークロードは完全に異なり、競合する方法でリソースをスラッシングします。それらを分離しておくのが最善です。これは、将来的にスケールアウトするのに役立ちます。
静的コンテンツ用にnginxのような高速なウェブサーバーを実行し、Apacheを完全に廃止することを検討してください。可能であれば、どこでもnginxを実行してください。
接続の切断と切断によって、多くのリソースが消費されています。
より良いアドバイスについては、私は強くお勧めします: http://www.webpagetest.org/ 。これにより、サイトの読み込みに時間がかかる理由がわかり、パフォーマンスを修正するためのベストプラクティスのヒントがいくつかあります。gzip圧縮の有効化、javascriptとcssの縮小などです。ぜひお読みください。