识别高端 VPS 上的性能瓶颈(Apache 2.4 event_mpm/lighttpd/nginx)

识别高端 VPS 上的性能瓶颈(Apache 2.4 event_mpm/lighttpd/nginx)

我有一台来自 vpsblast 的高端 VPS(他们的 SSD13)——4 核、16GB RAM、320GB SSD 硬盘空间,位于 1GigE 互联网主干网上(几乎无可争议)。据我所知,它正在运行 OpenVZ(使用 simfs,存在 user_beancounters)。数据库位于同一数据中心的不同节点上,我正在运行 php-fpm,但此测试涉及静态 9.49kb 图像(因为 php-fpm 正在运行,应用程序经过了高度优化)。所有请求都通过 https,因此我运行了 http 和 https 测试来确定 SSL 是否是问题所在,但我不确定这是问题所在。操作系统是 Ubuntu 12.04 LTS。我测试了 apache 2.4(使用 event_mpm)、nginx 和 lighttpd,发现这三者的性能非常相似,这让我相信问题不在于 httpd。为了回答这些问题,我目前使用的是 apache 2.4。我在静态对象上的性能峰值约为 400rps(每秒请求数)。这相当于 3.7Mbps,远低于 1GigE 线路的限制。

那么第一个问题:什么表现应该我能看到这种设置吗?在 FreeNode 上的 #apache 讨论中,有人建议 10k 并发应该不是不可能的,我应该能够每秒处理 10k 个请求。这些期望不合理吗?

下一个问题是确定性能瓶颈。老实说,我不知道从哪里开始查找,因为一切看起来都很好(我在下面附上了上面的屏幕截图)。我没有进行任何 sysctl 调整,因为它们似乎主要由主机操作系统控制。我增加了 /etc/security/limits.conf 中的软和硬 ulimits:

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

我的 apache httpd.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>

我不认为这是 OpenVZ 配置中的限制,因为这是 user_beancounters 的输出(限制相当高)

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

在识别性能问题方面,这是一张表演数据专辑- 前两张图片是 blitz.io 测试进行到一半时 ATOP 的输出,然后是接近最大负载结束时的输出。第三张图片是 blitz.io 报告。第四张和第五张是相同的(ATOP+blitz.io 报告),针对的是同一个静态对象,但禁用了 SSL。blitz.io 测试在 60 秒内从 1 到 1000 个并发。虽然启用 SSL 后会有明显的开销,但我仍然没有接近我期望的性能 - 增加 blitz.io 上的并发性会使情况变得更糟。所以,我把这留给你的智慧,请随时询问任何澄清并建议任何更改让我尝试重新测试:)

答案1

由于事件 MPM 依赖于底层工作器配置 - 请尝试以下配置作为限制实验,然后如果更改导致可测量的差异,则意味着这至少是瓶颈之一。然后可以进一步调整:

这些是 Apache 默认设置:

  • ServerLimit 16 - 您可以在发送的图像中看到已达到此限制 - 更改为 50
  • StartServers 2 - 这是初始启动 - 更改为 5
  • MaxClients 150 - 将其更改为 300
  • MinSpareThreads 25-更改为50
  • MaxSpareThreads 75-更改为150
  • ThreadsPerChild 25-更改为 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>

相关内容