Eu tenho um site baseado em WordPress rodando em uma hospedagem compartilhada. Seu tempo de resposta é muito decente (cerca de 2s para recuperar a página HTML e 5s para carregar todos os recursos).
Eu estava planejando movê-lo para um servidor virtual dedicado (Ubuntu 12.04 LTS), que teoricamente melhoraria as coisas e as tornaria mais consistentes, já que não são compartilhadas. No entanto, observei grave degradação do desempenho, com a página levando 10 segundos a ser gerada.
Eu excluí problemas de rede editando /etc/hosts
no servidor e mapeando o domínio para 127.0.0.1
. Eu usei o testador de carga do Apache ab
para obter o HTML, para que JS, CSS e imagens sejam excluídos. Ainda demorou 10 segundos.
Eu tenho o Zpanel instalado no servidor, que também usa o MySQL, e suas páginas são bem rápidas (1.5s) e também phpMyAdmin. Realizar algumas consultas no banco de dados wordpress diretamente através do phpMyAdmin também os retorna rapidamente, com tempos de consulta na região de 10 a 30 milissegundos.
A memória também é suficiente, com apenas 800Mb sendo usado da memória física de 1Gb disponível, então não parece ser um problema de troca. Eu também instalei a APC para tentar melhorar o desempenho do PHP, mas isso não teve nenhum efeito.
O que mais eu devo procurar? O que poderia estar causando essa degradação no desempenho? Poderia ser algum tipo de problema de I / O desde que eu estou executando em um servidor virtual baseado em nuvem?
Gostaria de poder levantar o problema com meu provedor, mas sem mostrar dados reais de algum diagnóstico, tenho medo de que ele apenas culpe meu aplicativo.
UPDATE com sar
output (a cada segundo) quando fiz uma solicitação HTTP:
02:31:29 CPU %user %nice %system %iowait %steal %idle
02:31:30 all 0.00 0.00 0.00 0.00 0.00 100.00
02:31:31 all 2.22 0.00 2.22 0.00 0.00 95.56
02:31:32 all 41.67 0.00 6.25 0.00 2.08 50.00
02:31:33 all 86.36 0.00 13.64 0.00 0.00 0.00
02:31:34 all 75.00 0.00 25.00 0.00 0.00 0.00
02:31:35 all 93.18 0.00 6.82 0.00 0.00 0.00
02:31:36 all 90.70 0.00 9.30 0.00 0.00 0.00
02:31:37 all 71.05 0.00 0.00 0.00 0.00 28.95
02:31:38 all 14.89 0.00 10.64 0.00 2.13 72.34
02:31:39 all 2.56 0.00 0.00 0.00 0.00 97.44
02:31:40 all 0.00 0.00 0.00 0.00 0.00 100.00
02:31:41 all 0.00 0.00 0.00 0.00 0.00 100.00
UPDATE 2 Após as sugestões de josten.
E / S:
iotop
falha com OSError: Netlink error: No such file or directory (2)
e sar -d
também falha com Requested activities not available in file /var/log/sysstat/sa14
. Eu acho que isso é porque esta é uma máquina virtual, assim como iostat
também falha. Poderia ser a razão pela qual %iowait
relatado por sar 1 10
é sempre 0%?
Carga da CPU:
O processo que está superando a% da CPU em htop
é, na verdade, apache2
. Eu estava esperando isso talvez seja o banco de dados, mas não é. Ele vai até 94% por alguns segundos quando eu faço uma nova requisição HTTP. Parece que este é o culpado.
Eu fiz um strace -f -t
e um resumo strace -c -f
. Parece haver uma enorme quantidade de lstat
chamadas (57786), com 2455 resultando em erros. Não faço ideia se isso é normal.
Além disso, a chamada mais importante foi wait4
, o que presumo ser normal (está apenas esperando) e munmap
. Top 5 abaixo.
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
51.06 0.124742 897 139 6 wait4
14.90 0.036388 1 57786 2455 lstat
9.67 0.023622 13 1857 munmap
7.69 0.018790 37 514 brk
6.70 0.016361 481 34 clone
2.87 0.006999 74 94 12 select
strace
em si diminuiu o apache por um fator de 2. Estou tentando entender o traço longo agora para ver se há algo indicativo do que estava causando o aumento da CPU por alguns segundos.
Qual é a hora típica de lstat
para um servidor com bom desempenho? Desejo coletar algumas informações para que eu possa reclamar de maneira construtiva para o provedor se for a falha de acesso ao armazenamento.
UPDATE Saída do teste de leitura aleatória fio
:
random-read: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=sync, iodepth=1
fio 1.59
Starting 1 process
random-read: Laying out IO file(s) (1 file(s) / 128MB)
Jobs: 1 (f=1): [r] [100.0% done] [12185K/0K /s] [2975 /0 iops] [eta 00m:00s]
random-read: (groupid=0, jobs=1): err= 0: pid=24264
read : io=131072KB, bw=10298KB/s, iops=2574 , runt= 12728msec
clat (usec): min=119 , max=162219 , avg=380.34, stdev=957.37
lat (usec): min=119 , max=162219 , avg=380.89, stdev=957.40
bw (KB/s) : min= 7200, max=13424, per=99.89%, avg=10285.72, stdev=1608.68
cpu : usr=2.80%, sys=18.65%, ctx=33511, majf=0, minf=23
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued r/w/d: total=32768/0/0, short=0/0/0
lat (usec): 250=45.57%, 500=37.17%, 750=3.41%, 1000=7.83%
lat (msec): 2=5.67%, 4=0.27%, 10=0.08%, 20=0.01%, 250=0.01%
Run status group 0 (all jobs):
READ: io=131072KB, aggrb=10297KB/s, minb=10545KB/s, maxb=10545KB/s, mint=12728msec, maxt=12728msec
A única dica que tenho agora é que a linha de CPU da saída fio
parece mostrar um pouco de atividade quando comparada a outros sistemas. Eu corri na minha máquina Ubuntu local e a saída era:
cpu : usr=0.19%, sys=0.59%, ctx=32923, majf=0, minf=23
A porcentagem usr
parece ser uma pequena fração do que está sendo reportado no meu servidor.
UPDATE Re PHP APC. Sim está instalado.
Saída do phpinfo:
APC Support enabled
Version 3.1.7
APC Debugging Disabled
MMAP Support Enabled
MMAP File Mask no value
Locking type pthread mutex Locks
Serialization Support php
Revision $Revision: 307215 $
Build Date May 2 2011 19:00:42
Existe alguma configuração específica que devo verificar? Estas são as configurações que eu tenho (valor local, valor mestre):
apc.cache_by_default On On
apc.canonicalize On On
apc.coredump_unmap Off Off
apc.enable_cli Off Off
apc.enabled On On
apc.file_md5 Off Off
apc.file_update_protection 2 2
apc.filters no value no value
apc.gc_ttl 3600 3600
apc.include_once_override Off Off
apc.lazy_classes Off Off
apc.lazy_functions Off Off
apc.max_file_size 1M 1M
apc.mmap_file_mask no value no value
apc.num_files_hint 1000 1000
apc.preload_path no value no value
apc.report_autofilter Off Off
apc.rfc1867 Off Off
apc.rfc1867_freq 0 0
apc.rfc1867_name APC_UPLOAD_PROGRESS APC_UPLOAD_PROGRESS
apc.rfc1867_prefix upload_ upload_
apc.rfc1867_ttl 3600 3600
apc.serializer default default
apc.shm_segments 1 1
apc.shm_size 32M 32M
apc.slam_defense On On
apc.stat On On
apc.stat_ctime Off Off
apc.ttl 0 0
apc.use_request_time On On
apc.user_entries_hint 4096 4096
apc.user_ttl 0 0
apc.write_lock On On
UPDATE Aumentou apc.shm_size
para 96M. A contagem total do cache agora é 0 e há 96,5% de acertos no cache após algumas atualizações do site aqui e ali. O uso de memória da APC é de 25,4 MB grátis.
Parece ter reduzido o tempo de carregamento em 3 segundos ou mais, agora para cerca de 4 a 5 segundos se eu fizer um wget
puro do próprio servidor sem obter nenhuma imagem, etc. Ainda mais que duas vezes mais lento que o outra hospedagem, mas definitivamente foi uma melhoria.
Eu ainda estou achando estranho porque estava demorando tanto para renderizar essas páginas quando o servidor está totalmente ocioso (eu não tenho o APC instalado no meu PC de desenvolvimento e ele não tem esse tipo de comportamento). E ainda é estranho onde esses segundos extras restantes estão sendo desperdiçados.