Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal!
Estou com um abacaxi bem grande para descascar com o Apache, não sei mais o que fazer.
Tenho o seguinte VPS no vps.net:
21ghz cpu
7400mb memória
1gbps na distribuição
Linux Debian x64 LAMP
O Apache Worker está da seguinte forma:
KeepAlive On
MaxKeepAliveRequests 0
KeepAliveTimeout 1
<IfModule mpm_worker_module>
MaxClients 4000
ThreadsPerChild 50
ServerLimit 80
</IfModule>
Toda rodada do brasileirão, na hora dos jogos, o pico de acessos do blog é bastante incrementado.
O problema é quando o número de acessos simultâneos está alto. Estou utilizando como contador o whos.amung.us.
Quando está em 2500+ começa a engasgar.
Digamos, de cada 5 requisições no browser, 3 dá 404 e 2 renderiza o site após 10 segundos.
O uso de memória naquele momento nunca ultrapassa 1400mb.
Alguma idéia???
Vamos por partes...
Todos os módulos que você não precisa já estão "desligados"?
O que mais roda neste servidor? Sabemos que o Apache roda com PHP. O que mais tem? MySQL, Postgres, etc? Informe sobre os módulos do PHP também e configurações de tempo do php.ini (max_execution_time por exemplo).
Desse número que você informa, são quantas conexões e quantos simultâneos?
Tente esta config:
StartServers 4ServerLimit 8
MaxClients 32
MinSpareThreads 4
MaxSpareThreads 16
ThreadsPerChild 4
MaxRequestsPerChild 1000
veja as quesões do #4 e, se puder verifique nos logs de erros se não apresenta mensagens de conflitos do worker ou mesmo prefork...
tenho alguns sistemas em vps com centos 5.5 com problemas assim.. pode não ser o seu caso, mas é bom analisar
>
Vamos por partes...
Todos os módulos que você não precisa já estão "desligados"?
O que mais roda neste servidor? Sabemos que o Apache roda com PHP. O que mais tem? MySQL, Postgres, etc? Informe sobre os módulos do PHP também e configurações de tempo do php.ini (max_execution_time por exemplo).
Desse número que você informa, são quantas conexões e quantos simultâneos?
Tente esta config:
StartServers 4
ServerLimit 8
MaxClients 32
MinSpareThreads 4
MaxSpareThreads 16
ThreadsPerChild 4
MaxRequestsPerChild 1000
Prog,
"módulos que você não precisa" -> a que módulos você se refere?
O mysql está no sistema, mas apenas para o admin. Quando o publico acessava via mysql, só rodava 900 simultaneo (muito mal).
Ai fiz uma rotina pra escrever json a cada 30 segundos e o povo começou a pegar via json.
Ele estava na locaweb e teve dias que aceitou até 6850 pessoas acessando simultaneamente (contado pelo who.amung.us). Mas fui expulso de lá devido ao estouro do tráfego mixuruca deles de 300gb (gastava 100gb/rodada do brasileirão).
Agora no vps.net a mesma aplicação está parando nos 2500 simultaneos. Eu diria q ela gasta apenas memória.
O max_execution_time está em 30 e o max_input_time em 60. O memory_limit está em 128mb.
Nos logs do apache consta apenas alguns warnings do php, tais como "var not defined".
Sobre a config que você passou, pelo que interpretei ThreadsPerChild 4 x ServerLimit 8 daria 32 conexoes simultaneas neh. Isso não faria nem cócegas certo?
Alguma idéia (sem ser balanceamento de carga)?
>
veja as quesões do #4 e, se puder verifique nos logs de erros se não apresenta mensagens de conflitos do worker ou mesmo prefork...
tenho alguns sistemas em vps com centos 5.5 com problemas assim.. pode não ser o seu caso, mas é bom analisar
hinom,
#4 você se refere que é o "SendBufferSize"? Se sim, onde habilita isso?
Você pode mostrar/falar mais sobre sua aplicação?
De quantos usuários simultâneos e ativos sua aplicação precisa?
Lembre-se, em informática, tudo tem um limite.
O que eu quero dizer com a frase acima?
Bom, eu quero ter 4000 usuários concorrentes ativos! :)/>/>/>
Tudo bem, o cálculo base para saber quanto de recurso você pode ter...
150 clientes GB RAM, ou seja, se você tem 7GB, 150 7 = 1050 usuários concorrentes.
Este número é o "ideal".
Ah, mas eu consegui chegar a 6234598756689 pelo amung.us. Não sei como isso funciona, mas não me parece ser uma estatística de acessos concorrentes.
Também não é possível fazer um teste de carga com o ab (Apache Benchmark). Para isto seria necessário uma rede de equipamentos e uma conexão colossal.
---------------------------------------
Voltando...
Módulos do apache:
mod_ssl (para conexão segura, se não estiver usando HTTPS, desabilitar);
mod_rewrite (para "re-escrita" da URL, utilizado em URL amigáveis e proteção, se sua aplicação não precisa desse recurso, desabilitar);
mod_deflate (para compactação de conteúdo, é bem util, mas se você não usa, desabilitar);
Fora tantos outros que podem estar habilitados sem necessidade. Veja aqui:
http://httpd.apache.org/docs/2.0/mod/
(desconsidere a lista de módulos core)
Estatísticas do Apache:
Para saber as conexões concorrentes e ativas no sistema na porta 80:
Para saber threads em execução do Apache:
Uma outra coisa que pode te trazer informações em tempo real é o módulo status do Apache, leia mais aqui: http://httpd.apache.org/docs/2.0/mod/mod_status.html
Sobre os valores que eu passei:
ServerLimit 8
MaxClients 32
A quantidade máxima de conexões concorrentes seria:
8 * 32 = 256 conexões simultâneos.
ThreadsPerChild esta equivocado na minha configuração, este parametro não faz parte do módulo prefork. Desconsidere!
Aguardando mais informações!
>
Você pode mostrar/falar mais sobre sua apli...
Prog,
sobre os modulos, estou usando apenas o rewrite. Vou verificar todos os outros e desabilitar.
O número seguro realmente seria 4000. Nessa rodada 37, chegou no pico de 3700.
Se quiser dar uma olhada: www.cartolacfds.com/scouts-ao-vivo
Cada requisição consiste basicamente em ler o json via fread.
Como eu estou no apache worker, o ThreadsPerChild é preenchido.
eu ja cheguei definir 14gb de ram no prefork, lembro que estava +- assim:
ServerLimit 8000
StartServer 8000
MinSpareThreads 800
MaxSpareThreads 14200
ThreadLimit 5
ThreadsPerChild 5
MaxClients 8000
MaxRequestsPerChild 0
ele usava 11gb dos 14gb de memoria, mas gerava o mesmo problema. Por isso q tentei migrar para o worker,
aí um colega lá do stack overflow me passou aquela configuração que postei no inicio.
Não entendi isso:
**150 clientes GB RAM, ou seja, se você tem 7GB, 150 7 = 1050 usuários concorrentes.**
Ok, desculpe, não sei pq achei que estivesse usando prefork.
>
Não entendi isso:
150 clientes GB RAM, ou seja, se você tem 7GB, 150 7 = 1050 usuários concorrentes.
Isto é o recomendado, 150 clientes para cada GB de memória.
Estou levando em consideração a informação do tópico, onde você informa que seu servidor possui 7400MB de memória.
>
Ok, desculpe, não sei pq achei que estivesse usando prefork.
Isto é o recomendado, 150 clientes para cada GB de memória.
Estou levando em consideração a informação do tópico, onde você informa que seu servidor possui 7400MB de memória.
Entendi...atualmente com os 2500 ele está gastando 1300/7400. Há muita memória ociosa.
Estranho demais não?
Esta usando algum comando para ver a memória ou esta recebendo esta informação de outra forma (uma página web, por exemplo)?
Para o módulo worker os números são outros, vou avaliar aqui e te passo um exemplo.
----------------------------
Bom, pelo que deu pra entender até agora sua aplicação não usa MySQL, mas você faz requisições assíncronas em outra página, que deve ser a página da SportTV. Estou correto?
Você também leve em consideração o tempo de resposta do portal da SportTV quando o seu sistema esta ruim?
>
Esta usando algum comando para ver a memória ou esta recebendo esta informação de outra forma (uma página web, por exemplo)?
Para o módulo worker os números são outros, vou avaliar aqui e te passo um exemplo.
----------------------------
Bom, pelo que deu pra entender até agora sua aplicação não usa MySQL, mas você faz requisições assíncronas em outra página, que deve ser a página da SportTV. Estou correto?
Você também leve em consideração o tempo de resposta do portal da SportTV quando o seu sistema esta ruim?
Prog,
eu uso o free -m pra ver a memoria.
As requisições assincronas eu faço para pegar os dados do sistema de admin da pagina. Os meninos atualizam no mysql, ai tem uma rotina que escreve o json em cima dos dados deles. Portanto nada externo.
Eu fiz com ajax, devido que precisa atualizar a página do publico a cada 60 segundos, porém não quis simplesmente dar o refresh na pagina para evitar o consumo, somente atualizo os dados via ajax.
>
Entendi...atualmente com os 2500 ele está gastando 1300/7400. Há muita memória ociosa.
Estranho demais não?
Esse cálculo que apresentei funciona bem para o prefork, para o worker é tudo diferente.
Na verdade isto é uma média, pois vai depender dos módulos carregados.
>
Esse cálculo que apresentei funciona bem para o prefork, para o worker é tudo diferente.
Na verdade isto é uma média, pois vai depender dos módulos carregados.
O osso é que no prefork tb deu essa cáca. Algo que eu acho relevante tb, digamos esses módulos afetam um poco, uma vez que há hardware sobrando. Quer dizer que se aumentar os users, daqui a pouco vai dar crash tb, msmo com os módulos apagados.
O que eu posso sugerir agora é que teste novamente com prefork, usando os parâmetros que passei anteriormente.
PHP funciona melhor com prefork.
O que me diz?
cara,
me ajuda a entender essas 2 imagens.
estava conversando com um colega de trabalho pra ver o que poderia ser,
ele pediu pra mim fuçar nos historicos do cpu.
de uma olhada nisso:
http://i49.tinypic.com/9r831t.jpg
http://i46.tinypic.com/21ozceb.jpg
http://i45.tinypic.com/5mzt54.jpg
como é possivel? essa do dia 10 ate 12 esta incrivelmente pior, pq eu tava usando isso no prefork:
ServerLimit 8000
StartServer 8000
MinSpareThreads 800
MaxSpareThreads 14200
ThreadLimit 5
ThreadsPerChild 5
MaxClients 8000
MaxRequestsPerChild 0
ai depois diminuiu pela "metade" pq mudei para o worker:
<IfModule mpm_worker_module>
MaxClients 4000
ThreadsPerChild 50
ServerLimit 80
</IfModule>
Informe quanto de memória um processo do Apache consome (média) no seu ambiente usando módulo prefork.
(Deve ser algo entre 20 e 30MB)
Quanto as imagens... não sei como seria possível usar mais que 100% do CPU de um sistema. Não sei qual o calculo que ele faz, se for um quad-core e, por isso, considera-se 400%, por exemplo, embora ainda pareça estranho, mas plausível. Quantos cores (CPU) tem seu VPS?
>
Informe quanto de memória um processo do Apache consome (média) no seu ambiente usando módulo prefork.
(Deve ser algo entre 20 e 30MB)
Quanto as imagens... não sei como seria possível usar mais que 100% do CPU de um sistema. Não sei qual o calculo que ele faz, se for um quad-core e, por isso, considera-se 400%, por exemplo, embora ainda pareça estranho, mas plausível. Quantos cores (CPU) tem seu VPS?
cara, quando eu seto para
Dedicated CPU
21.6GHz
RAM
7280MB
ai digito mpstat ele diz que são 5 cpus.
Pelo que diz aqui, é o que você disse:
http://serverfault.com/questions/346410/cpu-utilization-over-100-in-linux-system
como são 5 cpu, ele chega ao maximo de 500 neh...
que m*****...
A memória que cada processo do Apache consome (média) em prefork é de extrema importância para passar uma configuração aceitável para o seu ambiente.
----------------------------
Uma configuração que eu acho aceitável para o seu ambiente.
StartServers 100
ServerLimit 300
MaxClients 300
MinSpareThreads 100
MaxSpareThreads 300
MaxRequestsPerChild 5000
Quando você passar a quantidade de memória/processo podemos fazer um cálculo mais preciso.
>
A memória que cada processo do Apache consome (média) em prefork é de extrema importância para passar uma configuração aceitável para o seu ambiente.
----------------------------
Uma configuração que eu acho aceitável para o seu ambiente.
StartServers 100
ServerLimit 300
MaxClients 300
MinSpareThreads 100
MaxSpareThreads 300
MaxRequestsPerChild 5000
Quando você passar a quantidade de memória/processo podemos fazer um cálculo mais preciso.
como eu descubro essa quantidade média de memória/processo ??
Se eu voltar para o prefork, poderia explainar a relação de MaxClients 300 para os 2500+ da nossa demanda?
Bom... O cliente recebe a requisição, processa, libera e fica pronto para receber uma nova requisição.
Considerei 23MB de média para cada processo Apache em prefork com mod_php.
7000MB / 23MB = ~304 clientes (arredondei para 300)
Você ainda deve deixar um pouco de memória livre para gestão do SO e de outras coisas do sistema caso exista (MySQL, etc). O correto para este cálculo seria desligar (parar o serviço) o Apache, ver quanto há de memória livre (# free -m) e usar este número como referência.
300 clientes para consumir toda a sua memória (7GB).
E como eu sei que 300 clientes serão suficientes? Não sei.
Em teoria, deveria ser suficiente.
Para saber o uso de memória do processo Apache:
# ps aux | grep apache
Pode ser que o processo do Apache seja nomeado httpd, neste caso:
# ps aux | grep httpd
>
Bom... O cliente recebe a requisição, processa, libera e fica pronto para receber uma nova requisição.
Considerei 23MB de média para cada processo Apache em prefork com mod_php.
7000MB / 23MB = ~304 clientes (arredondei para 300)
Você ainda deve deixar um pouco de memória livre para gestão do SO e de outras coisas do sistema caso exista (MySQL, etc). O correto para este cálculo seria desligar (parar o serviço) o Apache, ver quanto há de memória livre (# free -m) e usar este número como referência.
300 clientes para consumir toda a sua memória (7GB).
E como eu sei que 300 clientes serão suficientes? Não sei.
Em teoria, deveria ser suficiente.
Para saber o uso de memória do processo Apache:
# ps aux | grep apache
Pode ser que o processo do Apache seja nomeado httpd, neste caso:
# ps aux | grep httpd
Tá. Só tem um problema: eu tinha 1 ticket grátis de suporte sob demanda, aí usei pra ativar o worker.
Sabe como mudar de novo para o prefork?? Se usar um ticket agora, é 10 dolares kkk
Qual a distribuição?
>
Qual a distribuição?
do linux? Debian x64
da uma olhada nos topicos 3.1 e 3.6 e me diz o q acha
http://www.stdlib.net/~colmmacc/Apachecon-EU2005/scaling-apache-handout.pdf
Li algumas partes do documento que você passou. Uma grande, e principal, diferença do ambiente dele para o seu é que ele não usa PHP. O cenário dele diz respeito a aumentar a performance para um servidor FTP, ou seja, apenas conteúdo estático. Você dá refresh na página de 60 em 60 segundos, por este motivo o conteúdo não pode ser "cacheado".
Quanto a troca de MPM:
Bom... se estiver sendo utilizado o pacote original dos repositórios do Debian, basta seguir como descrito a seguir:
Verifique se o apache2.conf já estiver configurado para trabalhar com preform e worker, basta fazer:
Para retornar ao worker:
Apenas 1 dos 2 módulos pode estar instalado e por este motivo ao executar o procedimento de instalação do mpm-prefork o processo vai desinstalar o mpm-worker.
Um detalhe que estava observando, o parâmetro ServerLimit não é necessário para o preform, basta o MaxClients, neste caso o ServerLimit assume o mesmo valor de MaxClients.
Não se esqueça de observar o arquivo apache2.conf (/etc/apache2/apache2.conf). Abaixo segue original deste arquivo para a configuração dos módulos MPM, altere a parte referente a prefork para atender ao requisito:
#### Server-Pool Size Regulation (MPM specific)
##
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
<IfModule mpm_event_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
Se não tiver sendo utilizado um pacote oficial do repositório, ou seja, um pacote compilado.
"Houston, we have a problem."
Vai ter que abrir o ticket. :(/>
Li algumas partes do documento que você passou. Uma grande, e principal...
Cara... acho q descobri o q está acontecendo.
O cara do suporte disse que a velocidade da internet é de 20mb/s (ou 156mbps)
Estava fazendo as contas, digamos que 2500 pessoas concorrentes tentem acessar o json (24kb), já da uma carga de 60mb.
Então como temos 20% do cpu em uso, 17% da memória em uso, tudo leva a crer que esses engasgos são por conta da broadband, certo?
Se está certo, alguma saída palpável?
veja se ajuda:
http://forum.imasters.com.br/topic/291988-otimizando-performance-servidor-apache/
>
veja se ajuda:
http://forum.imasters.com.br/topic/291988-otimizando-performance-servidor-apache/
Olá hinom,
eu comecei com o prefork, mas ai tive o msmo problema.
Aí migrei pro worker... mas ainda não consigo resolver.
Hardware sobrando... Site quase com php estatico... e trava =/