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

我有一个来自vpsblast(他们的SSD13)的高端VPS – 在1GigE互联网主干上的4个核心,16GB RAM,320GB固态硬盘空间(几乎没有争议)。 就在我可以告诉它正在运行OpenVZ(使用simfs,user_beancounters存在)。 数据库在同一个数据中心的不同节点上,而且我正在运行php-fpm,但是这个testing涉及到一个静态的9.49kb图像(因为php-fpm在飞行,应用程序非常优化)。 所有请求都通过https,所以我运行了http和httpstesting来确定SSL是否是问题,但我不相信这是问题。 操作系统是Ubuntu 12.04 LTS。 我已经testing了apache 2.4(使用event_mpm),nginxlighttpd,而且我看到了三个类似的performance,这导致我相信这不是httpd问题。 我目前使用Apache 2.4来解决这些问题。 我在静态物体上的performance达到峰值约400rps(请求每秒)。 这就像3.7Mbps,在1GigE线的限制下。

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

下一个问题是确定性能瓶颈。 我真的不知道从哪里开始看,因为一切看起来都很好(我已经包含了从下面的截图)。 我没有做任何sysctl调整,因为他们似乎主要是由主机操作系统控制。 我在/etc/security/limits.conf中增加了软硬限制:

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> 

我不认为这是OpenVZconfiguration的限制,因为这里是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.iotesting中途的ATOP输出,然后在最大负载下接近末端。 第三个图像是blitz.io报告。 第四和第五个是相同的(ATOP + blitz.io报告)相同的静态对象,但SSL禁用。 blitz.iotesting在60秒内从1到1000次并发。 虽然在启用SSL的情况下存在明显的开销,但我仍然没有接近我期望的性能 – 在blitz.io上增加并发性会使事情变得更糟。 所以,我把这个留给你的智慧,随时请求任何澄清,并build议任何改变,我尝试和重新testing:)

由于事件MPM依赖于基本的工作者configuration – 尝试以下configuration作为限制性实验,然后如果更改导致可测量的差异,这意味着这至less是瓶颈之一。 然后可以进一步调整:

这些是Apache的默认值:

  • ServerLimit 16 – 你可以看到这是你发送的图像到达 – 改为50
  • StartServers 2 – 这是初始启动 – 更改为5
  • MaxClients 150 – 将其更改为300
  • MinSpareThreads 25 – 更改为50
  • MaxSpareThreads 75 – 更改为150
  • ThreadsPerChild 25 – 更改为50

由于我们正在改变2-3倍,你应该看到大致相同因子的线性改善。

编辑 – 改进的configuration – MaxClients(现在称为MaxRequestWorkers)是botleneck。 一旦服务器实际上可以接受一定数量的客户端,那么只要确保每个子项的subprocess和线程数量不超过该数量即可。

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