我有一台来自 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>