私は768MBのラムでcentos 5.5を実行しています。 server reached MaxClients setting, consider raising the MaxClients setting
ログのApacheも非常に遅くなります。サボテングラフを見ると、サーバーがすべてのリソースを使用していません。
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 10
ServerLimit 1024
MaxClients 768
MaxRequestsPerChild 4000
</IfModule>
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
free -m
total used free shared buffers cached
Mem: 768 352 415 0 0 37
-/+ buffers/cache: 315 452
Swap: 0 0 0
top - 11:03:54 up 41 days, 11:53, 1 user, load average: 0.05, 0.03, 0.00
Tasks: 35 total, 1 running, 34 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.3%st
Mem: 786432k total, 389744k used, 396688k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 38284k cached
次のことを試しましたが、サーバーの応答が非常に遅い
<IfModule worker.c>
#StartServers 2
#MaxClients 150
#MinSpareThreads 25
#MaxSpareThreads 75
#ThreadsPerChild 25
#MaxRequestsPerChild 0
StartServers 20
MaxClients 1024
ServerLimit 1024
MinSpareThreads 128
MaxSpareThreads 768
ThreadsPerChild 64
MaxRequestsPerChild 0
</IfModule>
free -m
total used free shared buffers cached
Mem: 768 324 443 0 0 37
-/+ buffers/cache: 286 481
Swap: 0 0 0
@regilero
に更新しました
<IfModule prefork.c>
StartServers 12
MinSpareServers 12
MaxSpareServers 12
MaxClients 50
MaxRequestsPerChild 300
</IfModule>
トップを使用して
Tasks: 36 total, 1 running, 35 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 786432k total, 613180k used, 173252k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 76488k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 10364 92 60 S 0.0 0.0 1:09.53 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd/808
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper/808
124 root 16 -4 12620 8 4 S 0.0 0.0 0:00.00 udevd
533 root 20 0 95504 5692 228 S 0.0 0.7 4:02.94 memcached
546 root 20 0 5924 332 276 S 0.0 0.0 6:54.51 syslogd
557 root 20 0 101m 1456 868 S 0.0 0.2 13:18.64 snmpd
570 root 20 0 62640 316 208 S 0.0 0.0 2:39.56 sshd
579 root 20 0 21656 24 20 S 0.0 0.0 0:00.00 xinetd
589 root 20 0 12072 12 8 S 0.0 0.0 0:00.05 mysqld_safe
940 mysql 20 0 559m 164m 3832 S 0.3 21.5 209:33.88 mysqld
1015 root 20 0 20880 200 132 S 0.0 0.0 0:10.48 crond
1023 root 20 0 46748 4 0 S 0.0 0.0 0:00.00 saslauthd
1024 root 20 0 46748 4 0 S 0.0 0.0 0:00.00 saslauthd
3605 root 20 0 62832 2168 636 S 0.0 0.3 0:02.58 sendmail
3613 smmsp 20 0 57712 1648 504 S 0.0 0.2 0:00.01 sendmail
17610 root 20 0 85932 3312 2600 S 0.0 0.4 0:00.02 sshd
17612 mcmap 20 0 86072 1760 1012 S 0.0 0.2 0:00.17 sshd
17613 mcmap 20 0 12076 1656 1292 S 0.0 0.2 0:00.01 bash
17637 root 20 0 45052 1432 1120 S 0.0 0.2 0:00.00 su
17638 root 20 0 12180 1800 1324 S 0.0 0.2 0:00.08 bash
17740 root 20 0 246m 9264 4516 S 0.0 1.2 0:00.19 httpd
18264 Apache 20 0 282m 43m 4940 S 0.0 5.7 0:00.56 httpd
18514 Apache 20 0 279m 40m 4832 S 0.0 5.3 0:01.47 httpd
18518 Apache 20 0 273m 36m 4396 S 0.0 4.7 0:00.45 httpd
18528 Apache 20 0 251m 13m 3660 S 0.0 1.8 0:00.41 httpd
18529 Apache 20 0 278m 40m 4340 S 0.0 5.3 0:00.99 httpd
18530 Apache 20 0 278m 40m 4268 S 0.0 5.3 0:00.67 httpd
18548 Apache 20 0 272m 33m 3516 S 0.0 4.4 0:00.28 httpd
18552 Apache 20 0 280m 42m 3684 S 0.0 5.5 0:00.48 httpd
18553 Apache 20 0 271m 33m 3768 S 0.0 4.3 0:00.45 httpd
18555 Apache 20 0 274m 36m 3672 S 0.0 4.7 0:00.58 httpd
18572 Apache 20 0 247m 9020 2856 S 0.0 1.1 0:00.01 httpd
18578 Apache 20 0 280m 42m 3684 S 0.0 5.6 0:00.76 httpd
18589 Apache 20 0 246m 5452 676 S 0.0 0.7 0:00.00 httpd
18588 root 20 0 12624 1216 932 R 0.0 0.2 0:00.06
free -m
total used free shared buffers cached
Mem: 768 578 189 0 0 74
-/+ buffers/cache: 504 263
Swap: 0 0 0
最後の4時間のサボテンの結果の現在の画像を追加しました。繁忙期は月曜日火曜日です。それで、私は来週まで設定変更の更なる結果を見るのを待つでしょう。しかし、以前は最大10個のスレッドしか使用できなかったため、改善のように見えます。これを見て、もっと改善できると思いますか?
free -m
total used free shared buffers cached
Mem: 768 619 148 0 0 49
-/+ buffers/cache: 570 197
Swap: 0 0 0
新しいテスト
2GB Ram VPSボックスで、プリフォークを
StartServers 20
MinSpareServers 20
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
今日の朝、私のmemcacheサーバーは死にました
Nov 20 09:28:40 vps22899094 kernel: Out of memory: Kill process 12517 (memcached) score 81 or sacrifice child
Nov 20 09:28:40 vps22899094 kernel: Killed process 12517, UID 497, (memcached) total-vm:565252kB, anon-rss:42940kB, file-rss:44kB
Apacheで設定する最適な値は何ですか?
#/ etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="1024"
OPTIONS="-l 127.0.0.1"
/ etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
bind-address=127.0.0.1
#script
thread_concurrency=2
query_cache_size = 16M
query_cache_type=1
query_cache_limit=5M
# MyISAM #
#key-buffer-size = 32M
#myisam-recover = FORCE,BACKUP
# SAFETY #
#max-allowed-packet = 16M
#max-connect-errors = 1000000
# CACHES AND LIMITS #
tmp-table-size = 32M
max-heap-table-size = 32M
#query-cache-type = 0
#query-cache-size = 0
max-connections = 50
thread-cache-size = 16
#open-files-limit = 65535
#table-definition-cache = 1024
#table-open-cache = 2048
# INNODB #
#innodb-flush-method = O_DIRECT
#innodb-log-files-in-group = 2
#innodb-log-file-size = 5M
#innodb-flush-log-at-trx-commit = 1
#innodb-file-per-table = 1
#innodb-buffer-pool-size = 921M
# LOGGING #
log-error = /var/log/mysqld.log
log-queries-not-using-indexes = 1
slow-query-log = 1
slow-query-log-file = /var/log/mysqld-slow.log
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Mod_phpでApacheを使用する場合、Apacheはprefork
ではなくworker
モードで適用されます。として、php5がマルチスレッドをサポートすることが知られているとしても、いくつかのphp5ライブラリはマルチスレッド環境であまりうまく動作しないことも知られています(たとえば、あるスレッドでロケール呼び出しを行い、他のphpスレッドのロケールを変更します) 。
したがって、php-fpmのようにphpがcgiで実行されていない場合、Apache内にmod_phpがあり、Apacheはpreforkモードになっています。テストでは、単にプリフォーク設定にコメントし、ワーカー設定を増やしました。現在の設定は、プリフォーク設定のデフォルト値と共有設定の変更された値です。
StartServers 20
MinSpareServers 5
MaxSpareServers 10
MaxClients 1024
MaxRequestsPerChild 0
これは、Apacheに20プロセスから開始するように依頼することを意味しますが、何も処理を行わないプロセスが10以上ある場合は、この子の数を減らして、5から10のプロセスを利用できるようにします。 Apacheの増減速度は1分あたり1です。そのため、すぐに利用可能なApacheプロセスの数がかなり少ない古典的な状況(平均2)に戻ります。通常、利用可能なプロセスが5つほどあるため平均は低くなりますが、トラフィックが増加するとすぐにすべて使用されるため、Apacheは新しいフォークの作成が非常に遅いため、利用可能なプロセスはありません。これは、あなたのPHPリクエストが非常に長く、早く終了せず、Apacheフォークが別のリクエストを処理するのに十分早くリリースされないという事実によって確かに増加します。
最後の図で、赤いピークの前に少量の緑がありますか?これを5分ではなく1分ごとにグラフ化できる場合、この緑の量は、エラーメッセージなしで着信トラフィックを取るのに十分な大きさではないことがわかります。
ここで、1024
MaxClients
を設定します。この構成の変更後、サボテングラフは取得されません。そのような変更では、使用可能なプロセスがなくなると、Apacheは1024のビジーな子の制限で新しい子を分岐し続けるからです。子ごとに20MBのRAMのようなものを取ります(またはPHPに大きなmemory_limitがあり、64MBまたは256MBのようなものを許可し、これらのPHPリクエストが実際に使用していますより多くのRAM)、多分DBサーバー... RAMが768MBしかないため、サーバーの速度が低下しています。 Apacheが最初の20人の子を開始しようとしているとき、すでに利用可能なRAM制限に達している可能性があります。
そう。 Apache forkが使用するメモリの量を確認する(実行中にいくつかの上位コマンドを作成する)古典的な処理方法。次に、この量のRAM(つまり、プリフォークモードでApacheの子が並行して実行されます)。たとえば、12としましょう。この方法でこの番号をApacheのmpm設定に追加します。
<IfModule prefork.c>
StartServers 12
MinSpareServers 12
MaxSpareServers 12
MaxClients 12
MaxRequestsPerChild 300
</IfModule>
これは、常にすべてのRAMを使用し、トラフィックのピークに備えたいため、トラフィックの増減中に分岐の数を移動しないことを意味します。 300
は、300リクエスト後に各フォークをリサイクルすることを意味します。0よりも優れています。潜在的なメモリリークの問題がないことを意味します。 MaxClientsは12に設定されます 25または50は、いくつかの要求をキューに入れることができる (この奇妙なセンテンデを削除しました。12を超えるリクエストが受信された場合、次のリクエストがバックログキューにプッシュされると言った理由を思い出せませんが、MaxClientをターゲットプロセス数に設定する必要があります)。ListenBacklog
キューを処理するために12を超えます。より大きなキューを使用できますが、タイムアウトが発生する可能性があります
はい、それは12を超える並列リクエストを処理できないことを意味します。
さらにリクエストを処理する場合:
問題が実際にトラフィックのピークである場合、プロキシキャッシュサーバーなどのキャッシュを使用したソリューションを利用できます。問題がPHPのランダムな遅さである場合、それはアプリケーションの問題です。たとえば、PHPから別のサイトへのHTTPクエリを実行しますか?
そして最後に、@ Jan Vlcinskyが述べたように、nginxを試すことができます。phpはphp-fpmとしてのみ利用可能です。 RAMを購入できず、間違いなくテストに値する大きなトラフィックを処理する必要がある場合。
更新:内部ダミー接続について(それがあなたの問題であるが、おそらくそうでない場合)。
this link および this previous answer を確認してください。これは「正常」ですが、単純な仮想ホストがない場合、これらのリクエストはメインの重いアプリケーションにヒットし、遅いhttpクエリを生成し、一般ユーザーがApacheプロセスにアクセスできないようにします。これらは、グレースフルリロードまたは子の管理で生成されます。
シンプルで基本的な「機能する」デフォルトのVirtualhostがない場合、いくつかの書き換えによってアプリケーション上のこれらの要求を防ぎます。
RewriteCond %{HTTP_USER_AGENT} ^.*internal\ dummy\ connection.*$ [NC]
RewriteRule .* - [F,L]
更新:
Virtualhostが1つしかない場合は、内部のダミー接続から保護されません。最悪の場合、これらの接続が一意のVirtualhostで行われることは確実です。したがって、書き換えルールを使用して、アプリケーションへの副作用を実際に回避する必要があります。
サボテンのグラフィックを読んで、Apacheがワーカーモードのプリフォークモードのバグになっていないようです。 debianでhttpd -l
またはApache2 -l
を実行し、worker.cまたはprefork.cがあるかどうかを確認します。ワーカーモードの場合、アプリケーションでPHPの問題が発生する可能性がありますが、ワーカーの設定を確認する必要があります。以下に例を示します。
<IfModule worker.c>
StartServers 3
MaxClients 500
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestsPerChild 300
</IfModule>
それぞれが25のスレッドを含む3つのプロセスを開始します(したがって、デフォルトで3 * 25 = 75の並列リクエストが利用可能です)。また、250を超えるスレッドが何もしない(10プロセス)場合、一部のプロセスが強制終了されます。これらの設定はメモリで調整する必要があります。ここでは、500の並列プロセス(25スレッドの20プロセス)を許可します。あなたの使用法は多分もっとあります:
<IfModule worker.c>
StartServers 2
MaxClients 250
MinSpareThreads 50
MaxSpareThreads 150
ThreadsPerChild 25
MaxRequestsPerChild 300
</IfModule>
以下に、問題を解決できるアプローチを示します。解決できない場合は、トラブルシューティングに役立ちます。
現在のものと同一の2番目のApache仮想サーバーを作成します
すべての「通常の」ユーザートラフィックを元の仮想サーバーに送信する
特別なトラフィックまたは長時間実行されるトラフィックを新しい仮想サーバーに送信する
特別なトラフィックまたは長時間実行されるトラフィックは、レポート生成、保守操作、または<< 1秒で完了するとは思わないその他のものです。これは、Webページだけでなく、APIの提供時に発生する可能性があります。
リソースの使用率が低いにもかかわらず、MaxClientsを超えている場合、最も可能性の高い答えは、サービスが提供されるよりも速く到着する新しい接続があることです。遅い操作を2番目の仮想サーバーに配置すると、これが当てはまるかどうかの証明に役立ちます。 Apacheアクセスログを使用して、効果を定量化します。
Apacheの代わりにnginx(または他のイベントベースのWebサーバー)を使用することを検討しましたか?
nginxはより多くの接続を許可し、はるかに少ないリソースを消費します(イベントベースであり、接続ごとに個別のプロセスを作成しないため)。とにかく、実際の作業(WSGIサーバーなど)を行ういくつかのプロセスが必要になり、それらがフロントエンドWebサーバーと同じサーバーにとどまる場合は、パフォーマンスの問題を少し異なる場所にシフトします。
最新のApacheバージョンは同様のソリューションを可能にします(イベントベースの方法で構成します)が、これは私の専門分野ではありません。