Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

pedradegelo

Apache está engasgando com 2500+ usuarios simultâneos

Recommended Posts

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???

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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:

# netstat -pan | grep :80 | wc -l

Para saber threads em execução do Apache:

# ps -aufx | grep httpd | wc -l

 

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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>

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.