web-dev-qa-db-ja.com

ハイエンドVPSのパフォーマンスのボトルネックを特定する(Apache 2.4 event_mpm / lighttpd / nginx)

私はvpsblast(それらのSSD13)からかなりハイエンドのVPSを持っています-1GigEインターネットバックボーン上に4コア、16GB RAM、320GBのSSDハードドライブスペース(実​​質的に競合なし)。私が知る限り、OpenVZを実行しています(simfsが使用され、user_beancountersが存在します)。データベースは同じデータセンターの別のノードにあり、php-fpmを実行していますが、このテストは静的な9.49kbのイメージに関するものです(php-fpmが飛行していて、アプリが非常に最適化されているため)。すべてのリクエストはhttps経由で行われるため、httpテストとhttpsテストを実行して、SSLが問題であるかどうかを判断しましたが、それが問題であるとは確信していません。 OSはUbuntu12.04LTSです。 Apache 2.4(event_mpmを使用)、nginx、lighttpdをテストしましたが、3つすべてで非常に類似したパフォーマンスが見られ、問題はhttpdではないと思われます。私は現在、これらの質問の目的でApache2.4を使用しています。静的オブジェクトでの私のパフォーマンスは、約400rps(1秒あたりのリクエスト数)でピークに達します。これは3.7Mbpsのようなもので、1GigE回線の制限をはるかに下回っています。

したがって、最初の質問:この種のセットアップでどのようなパフォーマンスが見られるべきか? FreeNodeの#Apacheでの議論では、10kの同時実行は不可能ではなく、1秒あたり10kのリクエストを処理できるはずであることが提案されました。それらの期待は不合理ですか?

次の質問は、パフォーマンスのボトルネックを特定することです。すべてがうまく見えるので、正直なところどこから探し始めるのかわかりません(下のスクリーンショットを含めました)。ほとんどがホストOSによって制御されているように見えるため、sysctlを微調整していません。 /etc/security/limits.confのソフトとハードのulimitを増やしました。

www-data hard nofile 1048576
www-data soft nofile 1048576
root hard nofile 1048576
root soft nofile 1048576

私のApachehttpd.confは2.4のかなり標準ですが、これが私が行った変更です。

DocumentRoot "/var/www"
<Directory "/var/www">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

<IfModule setenvif_module>
BrowserMatch "MSIE 10.0;" bad_DNT
</IfModule>
<IfModule headers_module>
RequestHeader unset DNT env=bad_DNT
</IfModule>
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
</IfModule>
# Netscape 4.x has some problems…
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

# Don’t compress already-compressed files
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:exe|t?gz|Zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:avi|mov|mp3|mp4|rm|flv|swf|mp?g)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .pdf$ no-gzip dont-vary

Header append Vary User-Agent env=!dont-var
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/$1

SSLEngine on
SSLOptions +StrictRequire
SSLProtocol -all +TLSv1 +SSLv3
SSLCipherSuite ALL:!kEDH:!ADH:!SSLv2:!EXPORT56:!EXPORT40:!RC4:!DES:+HIGH:+MEDIUM:+EXP
SSLRandomSeed startup file:/dev/urandom 1024
SSLRandomSeed connect file:/dev/urandom 1024
SSLSessionCache        "shmcb:/usr/local/Apache2/logs/ssl_scache(512000)"
SSLSessionCacheTimeout  300
# Masked keys for privacy:)
SSLCertificateFile /usr/local/Apache2/conf/xxxxx.crt
SSLCertificateKeyFile /usr/local/Apache2/conf/xxxxx.key
SSLVerifyClient none
SSLProxyEngine off
<IfModule mime.c>
    AddType application/x-x509-ca-cert      .crt
    AddType application/x-pkcs7-crl         .crl
</IfModule>
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

ServerTokens Prod
Timeout 300
KeepAlive Off
<IfModule mpm_event_module>
    StartServers          5
    MaxClients         1024
    MinSpareThreads      50
    MaxSpareThreads     150
    ThreadLimit          64
    ThreadsPerChild      64
    MaxRequestsPerChild 20000
    ListenBacklog      4096
</IfModule>

これがuser_beancountersの出力であるため、OpenVZ構成の制限ではないと思います(制限はかなり高いです)

Version: 2.5
   uid  resource                     held              maxheld              barrier                limit              failcnt
 1592:  kmemsize                 83776469            113721344           2369781760           2606759936                    0
        lockedpages                  4161                10616               578560               578560                    0
        privvmpages                670407              2743929  9223372036854775807  9223372036854775807                    0
        shmpages                     5770                 7450              1048576              1048576                    0
        dummy                           0                    0                    0                    0                    0
        numproc                       233                 1044                 3560                 3560                    0
        physpages                  157907               290092                    0              4194304                    0
        vmguarpages                     0                    0              4194304  9223372036854775807                    0
        oomguarpages                49397                83795              4194304  9223372036854775807                    0
        numtcpsock                     23                 1317                57330                57330                    0
        numflock                        4                   11                32768                36045                    0
        numpty                          2                    9                  256                  256                    0
        numsiginfo                      1                   30                  256                  256                    0
        tcpsndbuf                  512360             31732952            293529600            440294400                    0
        tcprcvbuf                  376832             21577728            293529600            440294400                    0
        othersockbuf                52400               360896            146764800            293529600                    0
        dgramrcvbuf                     0                 6936             14676480             14676480                    0
        numothersock                   61                   95                57330                57330                    0
        dcachesize               28028491             50196571            457560436            503316480                    0
        numfile                       918                 2315               655360               655360                    0
        dummy                           0                    0                    0                    0                    0
        dummy                           0                    0                    0                    0                    0
        dummy                           0                    0                    0                    0                    0
        numiptent                      24                   24                 8448                 8448                    0

パフォーマンスの問題を特定するという点では、 パフォーマンスデータのアルバムです -最初の2つの画像は、blitz.ioテストの途中でATOP出力になり、最大負荷の下で最後に近づきます。 3番目の画像はblitz.ioレポートです。 4番目と5番目は、同じ静的オブジェクトに対して同じですが(ATOP + blitz.ioレポート)、SSLが無効になっています。 blitz.ioテストは、60秒間で1から1000の同時実行になります。 SSLを有効にするとかなりのオーバーヘッドが発生しますが、期待するパフォーマンスに近いものにはまだ近づいていません。blitz.ioの同時実行性を高めると、事態はさらに悪化します。だから、私はこれをあなたの知恵に任せ、説明を求めて、私が試して再テストするための変更を提案してください:)

2
fluffyponyza

イベントMPMは基礎となるワーカー構成に依存しているため、制限実験として次の構成を試してください。変更によって測定可能な違いが生じる場合は、これがボトルネックの少なくとも1つであることを意味します。その後、さらに調整することができます。

これらはApacheのデフォルトです。

  • ServerLimit16-送信した画像でこれに到達していることがわかります-50に変更します
  • StartServers2-これは最初の起動用です-5に変更します
  • MaxClients150-これを300に変更します
  • MinSpareThreads25-50に変更
  • MaxSpareThreads75-150に変更
  • ThreadsPerChild25-50に変更

2〜3倍変化しているので、ほぼ同じ係数の線形改善が見られるはずです。

編集-改善された構成-MaxClients(現在はMaxRequestWorkersとして知られています)が問題でした。サーバーが実際に特定の数のクライアントを受け入れることができるようになったら、子プロセスとスレッドの数を確認します-子あたりの数がその数を超えないようにします。

  <IfModule mpm_event_module>
    StartServers          5
    ServerLimit          32
    MinSpareThreads      64
    MaxSpareThreads     128
    ThreadsPerChild      64
    ThreadLimit          64
    MaxRequestWorkers   2048
    MaxRequestsPerChild 20000
    ListenBacklog      4096
  </IfModule>
0
Akber Choudhry