Estou ajustando minha página inicial para desempenho, atualmente ele lida com cerca de 200 solicitações / segundo no 3.14.by, que realiza 6 consultas SQL e 20 req / segundo no 3.14.by/forum, que é o fórum phpBB.
Curiosamente, os números são praticamente os mesmos em alguns servidores VPS e Atom 330 dedicados.
O software para servidor é o seguinte: Apache2 + mod_php prefork 4 childs (tentei números diferentes aqui), php5, APC, nginx, memcached para armazenamento de sessões PHP.
O MySQL está configurado para consumir cerca de 30% da RAM disponível (~ 150Mb em VPS, 700Mb em servidor dedicado)
Parece que há um gargalo em algum lugar que não me permite ir mais alto, alguma sugestão? (ou seja, eu sei que fazer menos de 6 SQLs o tornaria mais rápido, mas isso não parece um fator limitante, pois o sqld não consome mais do que alguns% no topo devido a consultas em cache)
Alguém já testou que chutar o apache2 pré-bifurcado e deixar apenas o nginx + php é muito mais rápido?
Mais alguns benchmarks
Small 40-byte static file: 1484 r/s via nginx+apache2, 2452 if we talk to apache2 directly.
Small "Hello world" php script: 458 r/s via ngin+apache2.
Atualização: Parece que o gargalo é o desempenho do MySQL nos dados em cache. A página com SQL único mostra 354req / s, com 6 SQLs - 180 req / s. O que você acha que eu posso ajustar aqui? (Eu posso extrair 100-200Mb para MySQL)
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
default-character-set=cp1251
collation-server=cp1251_general_cs
skip-character-set-client-handshake
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
skip-external-locking
bind-address = 127.0.0.1
key_buffer = 16M
max_allowed_packet = 8M
thread_stack = 64K
thread_cache_size = 16
sort_buffer_size = 8M
read_buffer_size = 1M
myisam-recover = BACKUP
max_connections = 650
table_cache = 256
thread_concurrency = 10
query_cache_limit = 1M
query_cache_size = 16M
expire_logs_days = 10
max_binlog_size = 100M
[mysqldump]
quick
quote-names
max_allowed_packet = 8M
[mysql]
[isamchk]
key_buffer = 8M
!includedir /etc/mysql/conf.d/
fonte
Respostas:
Obviamente, há muita coisa que você pode tentar. Sua melhor aposta é perseguir seus logs em busca de consultas que não usam índices (ativar logs para essas) e outras consultas não otimizadas. Compilei uma lista enorme de opções relacionadas ao desempenho ao longo dos anos, por isso incluí aqui um pequeno subconjunto para suas informações - espero que ajude. Aqui estão algumas notas gerais sobre o que você pode tentar (se ainda não o fez):
MySQL
Apache
PHP
Ajustes no SO
fonte
Se o gargalo não for CPU, seu IO - rede ou disco. Então .. você precisa ver o quanto de IO está acontecendo. Eu não teria pensado que era a rede (a menos que você esteja em um link half-duplex de 10 Mbps, mas vale a pena verificar o comutador caso a detecção automática não esteja funcionando corretamente).
Isso deixa a E / S do disco, o que pode ser um grande fator, especialmente nos VPSs. Use sar ou iostat para dar uma olhada nos discos e, em seguida, pesquise no google como encontrar mais detalhes se seu disco estiver sendo usado intensamente.
fonte
Gostaria de olhar para o cache com Nginx ( memcached ) ou Varnish .
Pelo menos você deve servidor de arquivos estáticos com Nginx como SaveTheRbtz disse.
fonte
Como o servidor não parece ser problema, talvez o gerador de carga seja. Tente executá-lo em várias máquinas.
fonte
Parece-me que você pode estar alcançando a quantidade máxima de conexões que o Apache permite. Dê uma olhada na sua configuração do Apache. Aumentar o limite do servidor e o número máximo de clientes deve ajudar se você ainda não estiver vinculado a outro limite, como E / S ou memória. Observe os valores presentes para mpm_prefork_module ou mpm_worker_module e ajuste de acordo com suas necessidades.
fonte
Essa carga é gerada por uma ferramenta ou cargas do mundo real?
Você pode verificar o memcached. Vi problemas em altas taxas de conexão causando latência no aplicativo.
Se estiver usando um gerador de carga, o que você obtém ao acessar uma pequena página estática?
Durante as cargas, convém verificar a pilha da rede quanto a condições TIME_WAIT. Talvez você esteja preenchendo sua fila de conexão.
Há mais de 100 razões e itens que você pode ver, mas sem mais informações, estou apenas dando palpites neste momento.
fonte
99% das vezes que problemas como esse são rastreados no banco de dados. Certifique-se de que seus índices de acerto sejam os primeiros. Se isso não funcionar, comece a armazenar em cache tudo o que puder.
fonte
Eu recomendo que você use (se possível) um pool de conexões para manter o banco de dados conectado aos seus aplicativos da Web (não é necessário reconectar a cada solicitação). Isso pode fazer uma enorme diferença de velocidade.
Além disso, tente analisar todas as suas consultas com EXPLAIN (e por que não criar um perfil de suas consultas com SHOW PROFILE?).
fonte