Como escalar além de 150 visualizações de páginas por minuto?

1

Eu tenho um aplicativo do Facebook escrito em PHP. Tem 150 visualizações de páginas por minuto e terá até 300 visualizações de páginas por minuto até o final deste ano. Ao obter mais PV, começo a ter problemas com a escalabilidade e, portanto, gostaria de pedir um conselho sobre como dimensionar para lidar com 300 VP / minuto.

Meu aplicativo é um aplicativo do tipo quizz, está hospedado em um VPS que pode usar:

  • 100% do processador central de 2,6 GHz
  • 500 MB, até 2 GB de RAM (cat / proc / user_beancounters disse que eu realmente tenho privvmpages = 500 MB, free -m mostra 2 GB)

A configuração do meu VPS é assim:

  • Centos 5
  • Lighttpd
  • Memcached
  • APC
  • MySQL
  • PHP usando FastCGI

Durante os últimos meses, consegui otimizar a configuração do MySQL, Lighttpd e PHP usando alguns tutoriais fornecidos na Internet. Consegui usar extensivamente o Memcached, e muitas solicitações caíram para 1ms, e aquelas não tratadas pelo memcache ocupam até 300 ms. Eu adicionei bons índices ao MySQL, então não está no alcance dos usuários.

Por algum tempo, as otimizações foram suficientes para lidar com novas solicitações, mas ultimamente devido à crescente popularidade do aplicativo, notei que algumas solicitações demoram mais de 3 segundos e, em caso de explosão crítica, meu Lighttpd apenas diz: os usuários obtêm o Erro Interno do Servidor 500.

Consegui encontrar (com certeza vou saber disso hoje) uma solução para corrigir o erro 500 definindo:

"PHP_FCGI_MAX_REQUESTS" => "500"

Mas o problema de escalabilidade ainda não foi resolvido. Eu preciso ser capaz de lidar com 2 x pedidos mais do que agora. E eu penso como fazer isso. Aqui estão as soluções que eu criei hoje:

  1. Upgrage VPS para 3,3 GHz em 2 núcleos
  2. Compre outro VPS e mova o banco de dados para lá
  3. Peça ajuda a alguém (que eu faço agora)

Eu posso comprar no meu distribuidor VPS um plano maior que tenha 3,3 Ghz no lugar de 2,6 Ghz que tenho agora e em 2 núcleos não um. Vai levar mais algum dinheiro, mas pode me ajudar? Como calcular se vai lidar com 300 PV?

A segunda ideia que tenho é comprar outro VPS e mover o banco de dados para lá. Deve dar ganho de CPU e memória para processos FastCGI e processo de banco de dados. Mas como saber se é melhor criar outro servidor ou comprar planos maiores para isso que tenho agora?

Então eu entro em 3 pontos - para perguntar a alguém. Então, aqui estou eu - um programador, não um administrador, com um problema de escalabilidade muito grande e peço sua ajuda.

Gostaria de saber como calcular quantos PV por minuto o meu VPS atual aguenta  - isso me ajudaria a decidir. Porque se 300 PV está além das minhas capacidades atuais de VPS - posso pensar imediatamente em outra solução e não mexer mais com a configuração.

Em segundo lugar - se é possível que o meu VPS consiga lidar com mais solicitações - é questão de configuração - do que precisaria de ajuda de alguém com mais conhecimento nesta questão para me ajudar a configurar a configuração correta. Eu posso fornecer essa configuração aqui ou enviar alguém por e-mail e espero saber de você quem tem tempo e conhecimento para me ajudar com isso. Não tenho tempo para mais experiências neste assunto.

Por fim - se estiver além das minhas habilidades de VPS, gostaria de saber como decidir se devo atualizar meu VPS ou gerar outro servidor? Qual solução será melhor para 300 PV alvo?

Se você chegou a este ponto das minhas perguntas, muito obrigado antecipadamente por perguntar. Sua ajuda, conselhos ou contatos para pessoas que podem ajudar nesta questão será muito útil para mim!

    
por Tomasz Smykowski 13.02.2010 / 13:38

4 respostas

4

O afunilamento fatal para VPSs razoavelmente especificados é normalmente E / S de disco, pois todas as VMs em execução em um determinado host estarão compartilhando o mesmo disco (ou matriz de discos - bons hosts VPS terão suas VMs em um array RAID10 ou semelhante ), na verdade, às vezes, vários hosts com VMs compartilham o mesmo array se forem configurados com um array de unidades extralargo. Isso é particularmente óbvio quando a memória se torna curta, já que as consultas do seu banco de dados estarão sempre em disco devido a não ter RAM para armazenar em cache nem mesmo um conjunto principal de dados.

Você pode descobrir que obter seu próprio servidor dedicado de baixa especificação melhoraria os problemas simplesmente porque suas necessidades podem monopolizar a largura de banda de E / S bruta e você verá menos latência de E / S à medida que as cabeças de unidade estão virando e voltando para suas solicitações de E / S, não várias outras máquinas que valem solicitações de E / S também. Isso pode até custar menos do que a solução "executar dois VPSs", especialmente quando você considera que em muitos casos a transferência de dados entre VMs contará com suas cotas de badwidth para as máquinas (verifique com seu host - isso nem sempre é o caso, mas a menos que você seja explicitamente informado de que não é mais seguro assumir que é), assim você pode ter aumentado os custos relacionados à largura de banda. Você pode se surpreender com o pouco que pode alugar uma pequena máquina baseada em P4, e, a partir de sua descrição, duvido que a potência da CPU seja o seu gargalo (memória e contenção de E / S são os prováveis culpados).

500Mb de memória pode ser uma limitação, então voltar para as duas ideias de VPSs se dividindo em duas VMs para que sua base de dados não esteja competindo com o processo FastCGI e memcached pode ajudar. Da mesma forma, pode valer a pena conseguir mais RAM fixa alocada - Eu nunca acreditei na idéia de "alocação de RAM estourável", pois assumo que cada sistema operacional tentará usar o máximo de RAM possível para a eficiência de E / S (embora Eu nunca usei um host que usa alocação de RAM estourável, então não tenho evidência direta para apoiar a falta de fé!). O que o restante de free -m mostra? Além disso, que tipo de tamanho são seus bancos de dados? Conseguir mais RAM fixa alocada pode ajudar mais do que mudar para servidor dedicado barato (já que a maioria das opções mais baratas vem com apenas 512Mb de RAM física, embora a maioria também possa ser atualizada por um custo extra) dependendo de quão apertado 512Mb realmente é para suas necessidades. / p>

Desculpe, não é uma resposta particularmente direta ...

Para testar como o RAM depende de seu desempenho, você pode configurar uma VM de especificações semelhantes em sua máquina local, duplicar sua configuração e lançar alguns softwares de benchmarking ( link é um lugar para começar) e então aumentar a RAM alocada para a VM para ver a diferença que faz para onde os erros começam a aparecer. Você pode simular É uma contenção de E / S incorreta também executando algumas outras VMs simples, cada uma executando algum tipo de referência de E / S, como o bonie ++.

    
por 13.02.2010 / 14:20
4

Desculpe, mas tem certeza de que está falando sobre visualizações de páginas por minuto, não por SEGUNDA? 300 páginas por minuto significam apenas 5 páginas por segundo, o que qualquer telefone celular deve ser capaz de fornecer sem suar, então eu realmente não consigo imaginar que uma CPU de 2,6 GHz não faça isso!

Se você realmente tiver certeza de que está falando de minutos, monitore sua E / S de disco, CPU e memória. Não é possível que um aplicativo adequadamente projetado seja executado tão lento, então você deve ter um grande problema de ajuste em algum lugar. Talvez você esteja fazendo milhares de acessos ao banco de dados MySQL ou ao memcache e você é muito sensível à latência de E / S (neste caso, a CPU permanecerá quase sem uso). Se a sua CPU está constantemente cheia, então você tem algo errado no código e não vale a pena tentar otimizar a E / S e outros componentes, a única solução viável é consertar o código.

    
por 14.02.2010 / 14:10
0

Eu costumo concordar com a resposta de David Spillett. Gostaria de acrescentar que colocar seu aplicativo e banco de dados no mesmo nó também é um grande gargalo porque os bancos de dados estão com fome de memória em geral. Hospedei vários sites de alto tráfego tão ocupados quanto o que você descreve e nunca colocamos nossa camada de banco de dados em VMs nem no mesmo nível de nossas camadas de aplicativos e da Web; nossas bases de dados estão sempre rodando em hardware real e dedicado.

Nossos front-ends, dependendo da arquitetura, são balanceados com o Cisco CSMs, mas você pode fazer um balanceamento de carga semelhante com o apache.

Se você é uma loja Linux, existem várias maneiras de lidar com isso sem o hardware caro da Cisco.

Dê uma olhada nisso: link

    
por 13.02.2010 / 16:17
0

I would like to know how can I calculate how many PV per minute my current VPS can handle - it would help me decide. Because if 300 PV is beyond my current VPS abilities - I can think right away on other solution and not messing more with configuration.

Isso é muito, muito difícil. É muito difícil prever o impacto que as otimizações terão. E as interações com outras partes do seu sistema.

Você precisa experimentar.

Secondly - if it's possible that my VPS can handle more requests - it's issue of configuration - than I would need some help from someone with more knowledge in this issue to help me set up config right. I can provide this config here or send someone by email and hope to know from you who has time and knowledge to help me with this. I don't have time for more experiments in this matter.

Se você não pode experimentar, tudo que qualquer um pode fazer é adivinhar cegamente. O que pode funcionar. E você pode ter um palpite cego particularmente sortudo e preciso.

Você deve analisar e examinar seu sistema em execução. Alguém "adivinhou" acima que você está batendo swap, e isso pode ser um bom palpite. Primeiro use top, vmstat, sar para obter uma imagem do que a caixa está fazendo. Você tem sua CPU rastreada? Você está fazendo IO massivo? Você está trocando? Isso lhe dará uma ideia razoável de qual é o problema.

Seu problema pode estar em qualquer lugar entre lighthttpd, PHP, memcache, MySQL. Os suspeitos do costume seriam:

  • PHP atrelando sua CPU
  • memcache tendo uma queda de ocorrências de cache (espaço insuficiente para armazenar em cache tudo o que você precisa)
  • o MySQL está lento. Se você estiver fazendo muitas gravações, por exemplo, escrever contenção pode matar você.

Você deve ser capaz de identificar o problema para um desses três.

300 exibições de páginas por minuto não são muito, são 5 exibições de páginas por segundo, portanto, parece haver algo estranho acontecendo.

    
por 14.02.2010 / 15:20