[解決済み] apacheサーバーがMaxClientsの設定に達したので、MaxClientsの設定を上げることを検討してください。
質問
私は centos 5.5 を 768MB の RAM で動かしています。
server reached MaxClients setting, consider raising the MaxClients setting
cactiのグラフを見ると、サーバーがすべてのリソースを使用していないことがわかります。
<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
<イグ
レギレロ
に更新しました。
<IfModule prefork.c>
StartServers 12
MinSpareServers 12
MaxSpareServers 12
MaxClients 50
MaxRequestsPerChild 300
</IfModule>
topを使用しています。
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時間のcactiの結果の現在の画像を追加しました。しかし、以前は最大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 ボックスで、prefork を次のように設定しました。
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
解決方法は?
Apacheをmod_phpで使用する場合、apacheの強制は
prefork
モードではなく
worker
. php5 がマルチスレッドをサポートしていることは知られていますが、 いくつかの php5 ライブラリはマルチスレッド環境ではあまりうまく動作しないことも知られています (たとえば、あるスレッドでロケールをコールすると、 他の php スレッドのロケールも変更されてしまうような場合などです)。
php-fpm のように php が cgi で動作していない場合、mod_php を apache 内で動作させ、apache を prefork モードで動作させています。 あなたのテストでは、単に prefork 設定をコメントアウトして worker 設定を増やしただけで、prefork 設定はデフォルト値、共有設定は若干変更された値になっています。
StartServers 20
MinSpareServers 5
MaxSpareServers 10
MaxClients 1024
MaxRequestsPerChild 0
これは、apacheに20プロセスで開始するよう依頼し、10プロセス以上何もしていない場合は、この子プロセスを減らし、5から10プロセスの間にとどめるよう指示したことを意味します。apacheの増加/減少速度は1分間に1回です。そのため、すぐに古典的な状況に戻ってしまうことになります。平均が低いのは、通常5つの利用可能なプロセスがあるためですが、トラフィックが増加するとすぐにそれらはすべて使用され、apacheが新しいフォークを作成するのが非常に遅いため、利用可能なプロセスはありません。これは、あなたのPHPリクエストがかなり長く、早く終わらないこと、そしてapacheのフォークが他のリクエストを処理できるほど早くリリースされないことから、確かに増加しています。
最後のグラフで、赤いピークの前にわずかな緑があるのがわかりますか?もしこれを5分ではなく1分単位でグラフ化すれば、この緑の部分が、エラーメッセージなしに流入するトラフィックを受け止めるには十分な量ではないことがわかるでしょう。
今度は
1024
MaxClients
. この設定変更後、cactiのグラフが表示されないのは、この設定変更により、利用可能なプロセスがなくなると、apacheは新しい子プロセスをフォークし続け、ビジー状態の子プロセスは1024個に制限されるからだと思われます。子プロセスあたり20MBのRAM(またはPHPのmemory_limitが大きく、64MBや256MBのようなものを許可していて、これらのPHPリクエストは実際にはもっとRAMを使っています)、おそらくDBサーバを使用します... あなたのサーバは、768MBのRAMしかないために遅くなるのです。おそらく、apache が最初の 20 個の子供を開始しようとしたときに、すでに利用可能な RAM の限界に達しているのでしょう。
古典的な対処法としては、apache のフォークが使用するメモリ量をチェックし (実行中にいくつか top コマンドを実行します)、それからこの RAM 量でどれだけの並列リクエストを処理できるか (つまり prefork モードでの並列 apache 子) を見つけます。例えば 12 を、例えば この数字をapache mpmの設定にこのように記述します。
<IfModule prefork.c>
StartServers 12
MinSpareServers 12
MaxSpareServers 12
MaxClients 12
MaxRequestsPerChild 300
</IfModule>
つまり、トラフィックの増減に関わらず、フォークの数を動かさないということです。なぜなら、常にすべてのRAMを使用し、トラフィックのピークに備えたいからです。そのため
300
は、300 リクエスト後に各フォークをリサイクルすることを意味します。これは 0 よりも優れており、メモリリークの問題が発生する可能性がないことを意味します。MaxClients は 12 に設定されています。
<ストライク
を処理するために12より多い25または50。
ListenBacklog
キューは、いくつかのリクエストを待ち行列にすることができます。
(この奇妙な sendende を削除しました。なぜこんなことを言ったのか覚えていませんが、12 件以上のリクエストが着信すると、次のものが Backlog キューにプッシュされます。) MaxClient は目標とするプロセス数に設定する必要があります。
そうそう、12個以上の並列リクエストは処理できないってことですね。
もっと多くのリクエストを処理したい場合。
- 買い足す RAM
- でapacheを使用してみてください。 ワーカー モードを使用しますが、mod_php を削除し、php を独自のプーラー設定を持つ並列デーモンとして使用します (これは php-fpm )、fastcgiで接続します。php-fpm を大量に並列処理させるには RAM が必要ですが、mod_php よりも少ないかもしれません。
- phpのプロセスで費やす時間を短縮する . Cactiのグラフから、潜在的な問題がわかります。11:25-11:30にトラフィックのピークがあるか、PHPコードが非常に遅くなっているのです。高速なリクエストは、並列リクエストの数を減らすことができます。
もしあなたの問題が本当にトラフィックのピークであるなら、プロキシキャッシュサーバーのようなキャッシュで解決できるかもしれません。もし問題がPHPのランダムな遅さであるなら...それはアプリケーションの問題です、例えばPHPから他のサイトへHTTPクエリをしていませんか?
そして最後に、@Jan Vlcinsky が述べているように、次のことを試してみてください。 nginx としてのみ利用可能で、phpは php-fpm . RAMを買うことができず、大きなトラフィックを処理する必要がある場合、それは決定的にテストをdesserveだ。
更新しました。 について 内部ダミー接続 (あなたの問題であればですが、そうでないかもしれません)。
確認 このリンク と 前回の回答 . これは「正常」ですが、シンプルなバーチャルホストを持っていない場合、これらのリクエストは、おそらくメインの重いアプリケーションをヒットし、遅いhttpクエリを生成し、通常のユーザーがあなたのapacheプロセスにアクセスするのを妨げています。彼らは、グレースフルリロードまたは子供の管理で生成されます。
もし、シンプルで基本的な "It works" デフォルトのバーチャルホストを持っていない場合は、いくつかの書き換えによって、アプリケーションへのこれらのリクエストを防ぐことができます。
RewriteCond %{HTTP_USER_AGENT} ^.*internal\ dummy\ connection.*$ [NC]
RewriteRule .* - [F,L]
更新しました。
1つのVirtualhostを持つことは、内部ダミー接続からあなたを保護しません、それは最悪です、あなたはこれらの接続があなたのユニークなVirtualhostで作られていることを今確信しています。そのため、リライトルールを使用することで、アプリケーションへの副作用を避ける必要があります。
あなたのcactiグラフィックスを読むと、あなたのapacheはpreforkモードではなく、workerモードのバグであるように思われます。実行
httpd -l
または
apache2 -l
ワーカーモードの場合、アプリケーションで PHP の問題が発生する可能性がありますが、 ワーカーの設定を確認する必要があります。
<IfModule worker.c>
StartServers 3
MaxClients 500
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestsPerChild 300
</IfModule>
3 つのプロセスを起動し、それぞれに 25 個のスレッドがあり (つまりデフォルトでは 3*25=75 個の並列リクエストが可能)、 75 個のスレッドが何もしないことを許可し、 1 つのスレッドが使われるとすぐに新しいプロセスが fork され、さらに 25 個のスレッドが追加されます。そして、何もしていないスレッドが 250 個以上 (10 プロセス) になると、いくつかのプロセスが強制終了されます。これらの設定は、あなたのメモリと一緒に調整する必要があります。ここでは、500の並列プロセス(25スレッドで20プロセス)を許可しています。あなたの使用量はもっと多いかもしれません。
<IfModule worker.c>
StartServers 2
MaxClients 250
MinSpareThreads 50
MaxSpareThreads 150
ThreadsPerChild 25
MaxRequestsPerChild 300
</IfModule>
関連
-
[解決済み] spark.sql.shuffle.partitionsとspark.default.parallelismの違いは何ですか?
-
[解決済み] 効率的なアウトオブコアソーティング
-
[解決済み] ApacheとNode.jsを同じサーバーで使う
-
[解決済み】再帰はループより速いことがあるのか?
-
[解決済み】2つの範囲が重なっているかどうかをテストする最も効率的な方法は何ですか?
-
[解決済み】JSFがゲッターを複数回呼び出す理由
-
[解決済み】Goはどうしてそんなに早くコンパイルできるのですか?
-
[解決済み】インターネット接続が遅い場合のシミュレーション【終了しました
-
[解決済み】GHCコアの読み込み
-
[解決済み] gccのffast-mathは実際に何をするのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] spark.sql.shuffle.partitionsとspark.default.parallelismの違いは何ですか?
-
[解決済み】再帰はループより速いことがあるのか?
-
[解決済み】JSFがゲッターを複数回呼び出す理由
-
[解決済み】再帰と反復のどちらを選ぶ?
-
[解決済み】Goはどうしてそんなに早くコンパイルできるのですか?
-
[解決済み】長さnのソートされていない配列の中でk番目に大きい要素をO(n)で見つけるにはどうすればよいですか?)
-
[解決済み】x86_64アセンブリで無駄なMOV命令を導入すると、なぜタイトループが速くなるのでしょうか?
-
[解決済み】ウェブサイトのストレステストに最適な方法【重複あり
-
[解決済み] 3Dゲームってなんであんなに効率的なの?[クローズド]
-
[解決済み] gccのffast-mathは実際に何をするのですか?