web-dev-qa-db-ja.com

ApacheサーバーがMaxClients設定に達しました。MaxClients設定を上げることを検討してください

私は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

enter image description here

@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

enter image description here 最後の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
27
shorif2000

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分ごとにグラフ化できる場合、この緑の量は、エラーメッセージなしで着信トラフィックを取るのに十分な大きさではないことがわかります。

ここで、1024MaxClientsを設定します。この構成の変更後、サボテングラフは取得されません。そのような変更では、使用可能なプロセスがなくなると、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は、いくつかの要求をキューに入れることができるListenBacklogキューを処理するために12を超えます。より大きなキューを使用できますが、タイムアウトが発生する可能性があります (この奇妙なセンテンデを削除しました。12を超えるリクエストが受信された場合、次のリクエストがバックログキューにプッシュされると言った理由を思い出せませんが、MaxClientをターゲットプロセス数に設定する必要があります)。

はい、それは12を超える並列リクエストを処理できないことを意味します。

さらにリクエストを処理する場合:

  • さらに購入[〜#〜] ram [〜#〜]
  • apacheをworkerモードで使用しようとしますが、mod_phpを削除し、独自のプーラー設定でphpを並列デーモンとして使用します(これはphp-fpm)、fastcgiに接続します。多数の並列php-fpmプロセスを許可するにはRAMを購入する必要がありますが、mod_phpよりも少ない場合があります。
  • PHPプロセスに費やす時間を減らします。サボテングラフから、潜在的な問題があります:11:25-11:30前後の実際のトラフィックピークまたは非常に遅くなっているphpコード。高速リクエストは、並列リクエストの数を減らします。

問題が実際にトラフィックのピークである場合、プロキシキャッシュサーバーなどのキャッシュを使用したソリューションを利用できます。問題が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>
36
regilero

以下に、問題を解決できるアプローチを示します。解決できない場合は、トラブルシューティングに役立ちます。

  1. 現在のものと同一の2番目のApache仮想サーバーを作成します

  2. すべての「通常の」ユーザートラフィックを元の仮想サーバーに送信する

  3. 特別なトラフィックまたは長時間実行されるトラフィックを新しい仮想サーバーに送信する

特別なトラフィックまたは長時間実行されるトラフィックは、レポート生成、保守操作、または<< 1秒で完了するとは思わないその他のものです。これは、Webページだけでなく、APIの提供時に発生する可能性があります。

リソースの使用率が低いにもかかわらず、MaxClientsを超えている場合、最も可能性の高い答えは、サービスが提供されるよりも速く到着する新しい接続があることです。遅い操作を2番目の仮想サーバーに配置すると、これが当てはまるかどうかの証明に役立ちます。 Apacheアクセスログを使用して、効果を定量化します。

1
Chris Johnson

Apacheの代わりにnginx(または他のイベントベースのWebサーバー)を使用することを検討しましたか?

nginxはより多くの接続を許可し、はるかに少ないリソースを消費します(イベントベースであり、接続ごとに個別のプロセスを作成しないため)。とにかく、実際の作業(WSGIサーバーなど)を行ういくつかのプロセスが必要になり、それらがフロントエンドWebサーバーと同じサーバーにとどまる場合は、パフォーマンスの問題を少し異なる場所にシフトします。

最新のApacheバージョンは同様のソリューションを可能にします(イベントベースの方法で構成します)が、これは私の専門分野ではありません。

0
Jan Vlcinsky