Eu tenho um VPS bastante sofisticado do vpsblast (seu SSD13) - 4 núcleos, 16GB de RAM, 320GB de espaço em disco rígido SSD em um backbone de Internet de 1GigE (praticamente sem contestação). Tão perto quanto eu posso dizer que está executando o OpenVZ (simfs é usado, user_beancounters existe). O banco de dados está em um nó diferente no mesmo datacenter, e eu estou rodando o php-fpm, mas este teste está relacionado a uma imagem estática de 9.49kb (como o php-fpm está voando e o aplicativo está extremamente otimizado). Todas as solicitações estão acima de https, então eu executei testes http e https para determinar se o SSL é o problema, mas não estou convencido de que esse seja o problema. OS é o Ubuntu 12.04 LTS. Eu testei o apache 2.4 (com o event_mpm), o nginx e o lighttpd, e estou vendo um desempenho muito similar dos três, o que me leva a acreditar que não é o httpd que é o problema. Atualmente estou usando o apache 2.4 para o propósito dessas perguntas. Meu desempenho no objeto estático atinge o pico em cerca de 400rps (solicitações por segundo). Isso é como 3.7Mbps, muito abaixo do limite da linha de 1GigE.
Então, primeira pergunta: qual seria o desempenho nesse tipo de configuração? Em uma discussão em #apache no FreeNode, foi sugerido que 10k simultaneidade não deveria ser impossível, e eu deveria ser capaz de servir 10k pedidos por segundo. Essas expectativas são irracionais?
A próxima questão é identificar o gargalo de desempenho. Eu sinceramente não tenho idéia de onde começar a procurar, já que tudo parece bem (eu incluí screenshots de cima). Eu não fiz ajustes sysctl, pois eles parecem ser controlados principalmente pelo sistema operacional host. Eu aumentei os ulimits suaves e difíceis em /etc/security/limits.conf:
www-data hard nofile 1048576
www-data soft nofile 1048576
root hard nofile 1048576
root soft nofile 1048576
Meu httpd.conf do apache é bastante padrão para o 2.4, mas aqui estão as alterações que fiz:
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>
Eu não acho que seja um limite na configuração do OpenVZ, já que aqui está a saída de user_beancounters (os limites são bem altos)
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
Em termos de identificar o problema de desempenho, aqui está um álbum de dados de desempenho - as duas primeiras imagens são a saída ATOP na metade o teste blitz.io e, em seguida, perto do final sob carga máxima. A terceira imagem é o relatório blitz.io. Quarto e quinto são os mesmos (relatório ATOP + blitz.io) para o mesmo objeto estático, mas com SSL desabilitado. Os testes blitz.io passam de 1 a 1000 simultaneidade por 60 segundos. Embora exista uma sobrecarga marcada com o SSL ativado, ainda não estou chegando perto do desempenho esperado - aumentar a simultaneidade no blitz.io torna as coisas ainda piores. Então, deixo isso à sua sabedoria, sinta-se à vontade para pedir quaisquer esclarecimentos e sugerir quaisquer mudanças para eu tentar e testar novamente:)