SlideShare uma empresa Scribd logo
quarta-feira, 23 de setembro de 2009
Desenvolvendo aplicações Web escaláveis com
       PHP




                                       Elton Luís Minetto


quarta-feira, 23 de setembro de 2009
quarta-feira, 23 de setembro de 2009
Quem?

        Graduado e pós-graduado em Ciência da Computação.
         Cursando MBA em Gerenciamento de Projetos
        Trabalha com PHP desde 2000
        Autor dos livros Frameworks para Desenvolvimento
         em PHP e Grid Computing in Research and Education
        Coordenador do PHPSC e membro do PHPBC
        Gerente de Desenvolvimento do Drimio e professor
         na Unochapecó(Chapecó)




quarta-feira, 23 de setembro de 2009
Terminologia

        Performance: a habilidade que uma aplicação tem de
         atingir um objetivo, como por exemplo responder no
         menor tempo possível
        Capacidade: a carga total que uma aplicação pode
         suportar
        Escalabilidade: a habilidade de uma aplicação manter
         a performance quando a carga de trabalho aumenta.
         É a junção da capacidade e da performance




quarta-feira, 23 de setembro de 2009
Ou…




quarta-feira, 23 de setembro de 2009
Ou...

        Performance: a velocidade do carro
        Capacidade: o limite de velocidade e o número de
         pistas da estrada
        Escalabilidade: quantos carros e pistas eu posso
         adicionar sem diminuir a velocidade do tráfego
               “Performance is a problem. Scaling your performance is a
                bigger problem”




quarta-feira, 23 de setembro de 2009
Camadas




quarta-feira, 23 de setembro de 2009
Web Servers

        Apache: Prefork X Worker
        Prefork
                 Usa fork(). Cada processo filho trata uma conexão
                 Grande uso de memória
                 Rápido
                 Bom para até duas CPUs
        Worker
                 Apache 2.0 e superior
                 Múltiplas threads dentro de cada filho (poucos filhos)
                 Diminui o uso de memória
                 Mais escalável
                 Melhor com múltiplos processadores
                 Não funciona com PHP!


quarta-feira, 23 de setembro de 2009
Web Servers

        “Usar servidores dedicados para conteúdo
         estático“ (Flickr)
        Apache pode ser substituído por outro mais leve:
         lighttpd, tux, thttpd
        Usar domínios diferentes para conteúdo estático e
         dinâmico. Exemplo:
               http://www.drimio.com (Servidor Apache)
               http://static.drimio.com (Servidor lighttpd)
               Usa a possibilidade dos navegadores acessarem múltiplos
                domínios ao mesmo tempo. Não sobrecarrega o servidor de
                conteúdo dinâmico




quarta-feira, 23 de setembro de 2009
Dica

        Apache + Lighttpd = Cura do Câncer! (by @guhelski)
        No apache:
           ProxyRequests Off
                ProxyPreserveHost On
                ProxyPass /public http://0.0.0.0:8080/
                ProxyPassReverse / http://0.0.0.0:8080/

        Todas as requisições para arquivos estáticos (/public)
         são repassados automaticamente para o lighttpd




quarta-feira, 23 de setembro de 2009
MySQL

        “Nenhum dos problemas de escalabilidade que
         enfrentaram era relacionado com PHP. Os maiores
         problemas encontrados eram relacionados com base
         de dados” (Digg)
        “Sharding é usado para quebrar a base de dados em
         várias porções menores” (Digg)
        “Fazer o tunning do MySQL durante a escolha da
         engine de armazenamento das tabelas. Usar InnoDB
         quando precisa de transações e MyISAM quando não
         precisa” (Digg)
        “Desnormalização ou cacheamento são as únicas
         formas de gerar uma tag cloud em milissegundos para
         milhões de tags” (Flickr)

quarta-feira, 23 de setembro de 2009
MySQL

        Usar replicação Master-Slave.
        Dividir a carga entre servidores. As requisições de
         modificação (INSERT, UPDATE,DELETE) podem ser
         enviadas para o Master. Os dados são replicados para
         os Slaves. As requisições de leitura (SELECT) são
         enviadas direto para os Slave
        Usar o tipo correto de dados na tabela:
               INT x SMALLINT x TINYINT
               CHAR x VARCHAR




quarta-feira, 23 de setembro de 2009
MySQL

        Master-Slave tem o problema do tempo de
         sincronização. Resposta: sharding.
               “Uma base de dados pode ser sharded por tabelas, dados ou
                faixas (ranges). É similar ao particionamento, mas possui
                algumas diferenças. Sharding envolve separar os dados em
                máquinas fisicamente distintas, enquanto que
                particionamento geralmente ocorre em mesmo hardware.
                MySQL não suporta nativamente sharding, mas sim tabelas
                particionadas, tabelas federadas (federated) e clusters.”




quarta-feira, 23 de setembro de 2009
quarta-feira, 23 de setembro de 2009
PHP

        Usar “boas práticas de programação”
                 echo é mais rápido que print
                 require_once() é lento
                 etc,etc
                 http://reinholdweber.com/?p=3
                 http://www.devolio.com/blog/archives/314-Practical-and-
                  impractical-PHP-Optimizations.html




quarta-feira, 23 de setembro de 2009
PHP

        PHP tem um compilador JIT que gera um código
         intermedário chamado opcode que é então
         interpretado. Por default essa compilação ocorre em
         todas as execuções do script. Para otimização e
         caching desse opcode, existem algumas soluções:
               Pacote APC do PECL
               XCache
               Zend Platform ($$$)




quarta-feira, 23 de setembro de 2009
Cache

        Memcached: é um sistema de cache de objetos em
         memória distribuída de alta performance.Ele foi
         desenvolvido de maneira que se consiga armazenar
         qualquer tipo de informação mas é largamente usado
         em aplicações web para armazenar conteúdos como
         resultados de queries SQL, sessões de usuários,
         arquivos CSS, etc.
        É possível criar “memcached farms”, aumentando a
         escalabilidade




quarta-feira, 23 de setembro de 2009
Memcached com PHP

       <?php
       $memcache = new Memcache;
       $memcache->connect('localhost', 11211);
       $memcache->connect('localhost', 11212);
       $memcache->connect(’192.168.0.10', 11212);
       $conteudo = $memcache->get('estados');
       if($conteudo === false) {
       	 $uf = array('SC','RS','SP');
       	 $memcache->set('estados', $uf, false, 100) ;
       	 $conteudo = $uf;
       }
       var_dump($conteudo);
       ?>




quarta-feira, 23 de setembro de 2009
Memcached - Dicas

        Existem 3 extensões para conectar o PHP com o
         Memcached:
               http://pecl.php.net/package/memcache (estável)
               http://pecl.php.net/package/memcached (estável com mais
                opções e mais rápido)
               http://www.modron.net/~dina/ezmemcache/ (novo mas com
                bom suporte a UDP)


        No Drimio usamos: (ainda em testes. Não faça isso em
         casa!)
               memcached via TCP para salvar os ítens
               ezmemcache via UDP para fazer a leitura. Mais rápido para
                muitas conexões simultâneas



quarta-feira, 23 de setembro de 2009
80-90% of the end-user response time is spent on
       the frontend.




quarta-feira, 23 de setembro de 2009
Javascript

        “Algumas pessoas reclamam que o Digg é lento. Mas
         isso é mais devido ao uso de grandes bibliotecas
         javascript e não da arquitetura de backend (Digg)”
        JavaScript pode ser comprimido
               http://developer.yahoo.com/yui/compressor/
               Usar compressão no Apache.




quarta-feira, 23 de setembro de 2009
Bibliotecas Javascript




quarta-feira, 23 de setembro de 2009
Bibliotecas Javascript




quarta-feira, 23 de setembro de 2009
Imagens

        Editores de imagens possuem grandes ferramentas
         para otimizar o tamanho do arquivo sem perder
         qualidade visual. Mesmo assim elas adicionam
         informações extra no documento, como nome da
         ferramenta, data de criação, etc.
        O site Smushit.com permite fazer upload de uma
         imagem ou indicar uma URL com a imagem a ser
         otimizada. Lançado em 10/2008 por pesquisadores
         do Yahoo! Exceptional Performance Team.




quarta-feira, 23 de setembro de 2009
Métricas




quarta-feira, 23 de setembro de 2009
Métricas




quarta-feira, 23 de setembro de 2009
Métricas




quarta-feira, 23 de setembro de 2009
Métricas - Drimio

        Gráfico de CPU de um dos servidores




quarta-feira, 23 de setembro de 2009
Métricas - Drimio

        Gráfico de CPU de um dos servidores




                                       Alerta




quarta-feira, 23 de setembro de 2009
Métricas - Drimio

        Gráfico de CPU de um dos servidores



                                                Pânico

                                       Alerta




quarta-feira, 23 de setembro de 2009
Métricas - Drimio

        Gráfico de CPU de um dos servidores



                                                Pânico

                                       Alerta
                                                         Cool!




quarta-feira, 23 de setembro de 2009
Ferramentas

           Apache ab,Siege, JMeter (aplicação)
           Ganglia,Nagios, MRTG, SNMP (S.O. e serviços)
           Firebug e YSlow (javascript, aplicação)
           Xdebug (profiling do PHP)
           Outras...




quarta-feira, 23 de setembro de 2009
Arquitetura

           Load Balancers
           Cache servers
           Bancos de dados Master/Slave, Sharding
           Scale-Out Wins Over Scale-
            Up  (escalar horizontalmente adicionando mais máqui
            nas é melhor do que verticalmente adicionando
            mais memória/CPU) 




quarta-feira, 23 de setembro de 2009
Arquitetura

        Sobre o Youtube:
              “Eles seguiram uma evolução comum:
               servidor único, único master e múltiplos
               slaves para leitura e depois particionaram a
               base de dados.”




quarta-feira, 23 de setembro de 2009
Arquitetura




quarta-feira, 23 de setembro de 2009
Arquitetura – Observações

        Como agora um cliente pode ser atendido por
         diversos servidores Web durante o uso, as sessões
         dos usuários devem ser salvas no banco de dados ou
         nos servidores de cache (Memcached)
        O MySQL Master é um SPOF( Single Point of Failure) –
         adicionar mais Masters em um esquema de replicação
         Master/Master. Ou usar sharding
        Diversos servidores de cache podem ser adicionados




quarta-feira, 23 de setembro de 2009
Lições Aprendidas

        Dividir a carga
        Usar servidores dedicados para conteúdo estático
        Ao invés de comprar máquinas grandes e
         centralizadas, é melhor comprar um monte de
         pequenas e baratas.
        Base de dados é um gargalo. Atacar e corrigir
         consultas lentas
        Coletar várias estatísticas de performance
        Usar InnoDB quando precisa de transações e MyISAM
         quando não precisa




quarta-feira, 23 de setembro de 2009
Lições Aprendidas

        Fazer medições realísticas. Capacity planning deve
         ser feito baseado em dados reais e não abstratos.
        Começar lentamente. Não comprar muito
         equipamento apenas porque está apavorado/feliz
         com o fato de que o seu site vai explodir.
        Descobrir o máximo de cada servidor para poder
         saber se está perto do limite




quarta-feira, 23 de setembro de 2009
Receita para tratar crescimento rápido

       while (true)
       {
           identify_and_fix_bottlenecks();
           drink();
           sleep();
           notice_new_bottleneck();
       }



       Fonte: YouTube Team


quarta-feira, 23 de setembro de 2009
Referências

        http://developer.yahoo.com/performance/
        http://highscalability.com/unorthodox-approach-
         database-design-coming-shard
        http://blog.feliperibeiro.com/2008/04/slides-da-
         palestra-php-para-desenvolvimento-de-aplicacoes-de-
         grande-porte.html
        http://www.xdebug.org
        http://devzone.zend.com/content/zendcon_07_slides/
         White_Eli_zendcon-2007-high-perf.pdf
        http://jst.pbwiki.com/
        http://www.slideshare.net/jallspaw/velocity2008-
         capacity-management1-484676


quarta-feira, 23 de setembro de 2009
Contato

       <?php
       $card = array(
       	 ‘nome’ =>                     ‘Elton Luís Minetto’,
       	 ‘site’ => ‘http://www.eltonminetto.net’,
       	 ‘e-mail’ => ‘elton.minetto@drimio.com’,
       	 ‘fone’ => ‘(47) 9189 6359’,
            ‘twitter’ => ‘eminetto’,
       );
       var_dump($card);
       ?>


quarta-feira, 23 de setembro de 2009
Perguntas?




quarta-feira, 23 de setembro de 2009

Mais conteúdo relacionado

PDF
Desenvolvendo aplicações Web escaláveis
PDF
Quero Slack! (Parte 3)
PDF
Opennebula Introdução
PDF
Opennebula instalação
PDF
Como criar infraestrutura de sites para receber milhões de usuários?
PDF
Alta disponibilidade com PostgreSQL
PPTX
Azure Functions e Java: Do Desenvolvimento a Produção
PPTX
ENIC/UFPB 2009. Arquitetura de Segurança Baseada em Security Paterns Para o O...
Desenvolvendo aplicações Web escaláveis
Quero Slack! (Parte 3)
Opennebula Introdução
Opennebula instalação
Como criar infraestrutura de sites para receber milhões de usuários?
Alta disponibilidade com PostgreSQL
Azure Functions e Java: Do Desenvolvimento a Produção
ENIC/UFPB 2009. Arquitetura de Segurança Baseada em Security Paterns Para o O...

Mais procurados (13)

PDF
(15) samba
DOC
Trab linux+sarg
PDF
Ao infinito e além com PHP memcached e Gearman
PDF
Administracao de sistemas_com_puppet
PPTX
Aula 7 (clouter)
PDF
ARTIGO CLUSTER DE ALTA DISPONIBILIDADE EM SISTEMAS LINUX
PDF
Alta Disponibilidade utilizando Pacemaker e DRBD
PDF
Programação Concorrente - Objetos e Concorrência
PDF
Criando Aplicações Resilientes
PPT
Cluster e replicação em banco de dados
PDF
Funcionamento kernel
ODP
PostgreSQL Transformando um elefante numa manada
PDF
Tutorial memcached
(15) samba
Trab linux+sarg
Ao infinito e além com PHP memcached e Gearman
Administracao de sistemas_com_puppet
Aula 7 (clouter)
ARTIGO CLUSTER DE ALTA DISPONIBILIDADE EM SISTEMAS LINUX
Alta Disponibilidade utilizando Pacemaker e DRBD
Programação Concorrente - Objetos e Concorrência
Criando Aplicações Resilientes
Cluster e replicação em banco de dados
Funcionamento kernel
PostgreSQL Transformando um elefante numa manada
Tutorial memcached
Anúncio

Destaque (14)

PDF
Html+para+iniciantes
PPTX
Entendendo os microframeworks em PHP
PPTX
Usando a programação web para mobile com Twitter Bootstrap
PPTX
Bootstrap desenvolvendo e customizando interfaces para web, introduzindo aos ...
PPTX
Mini-Curso sobre Bootstrap 3
PPTX
MVC Frameworks for building PHP Web Applications
PPT
Desenvolvendo com Bootstrap: um framework front-end que vale a pena!
PPSX
Introdução a Bootstrap 3
ODP
Arquitetura MVC, JavaBeans e DAO
PDF
Java Web - MVC básico com JSP e Servlets
PDF
Desenvolvimento em Três Camadas com PHP, MVC e Ajax
PDF
PHP Jedi - Boas Práticas e Alta Performance
PDF
Integração contínua em PHP com Jenkins
Html+para+iniciantes
Entendendo os microframeworks em PHP
Usando a programação web para mobile com Twitter Bootstrap
Bootstrap desenvolvendo e customizando interfaces para web, introduzindo aos ...
Mini-Curso sobre Bootstrap 3
MVC Frameworks for building PHP Web Applications
Desenvolvendo com Bootstrap: um framework front-end que vale a pena!
Introdução a Bootstrap 3
Arquitetura MVC, JavaBeans e DAO
Java Web - MVC básico com JSP e Servlets
Desenvolvimento em Três Camadas com PHP, MVC e Ajax
PHP Jedi - Boas Práticas e Alta Performance
Integração contínua em PHP com Jenkins
Anúncio

Semelhante a Desenvolvendo aplicações Web escaláveis com PHP (20)

PDF
App Web Escalaveis Fisl
PDF
ClusterizaçãO De AplicaçõEs Php
PDF
Clusterização de Aplicações PHP
PDF
PHP, Gearman e Memcache
PDF
Phpjedi 090307090434-phpapp01 2
PDF
Otimizacao de websites em PHP
PDF
Desenvolvendo aplicativos web escaláveis
PPTX
IntroduçãO Ao Desenvolvimento Web 2
PPTX
Introdução ao desenvolvimento web - 2 - iDez 2010
PDF
Python mudando o modo de desenvolver para a web - Marcos Daniel Petry
PDF
Python mudando o modo de desenvolver para a internet
PDF
PHP Classes - Desenvolvimento de sites de Web 2 0 em PHP para grandes audiências
PDF
Frameworks PHP
PDF
Frameworks de Desenvolvimento Web com PHP
PDF
Cache e Performance (in portuguese)
PDF
Frameworks Opensource: ferramentas para desenvolvimento rápido de aplicações Web
PDF
Melhorando a performance de aplicações com o uso do MemCache
PDF
Técnicas para ser escalável com PHP
PDF
Apache PHP MySQL
PPT
XPT Framework
App Web Escalaveis Fisl
ClusterizaçãO De AplicaçõEs Php
Clusterização de Aplicações PHP
PHP, Gearman e Memcache
Phpjedi 090307090434-phpapp01 2
Otimizacao de websites em PHP
Desenvolvendo aplicativos web escaláveis
IntroduçãO Ao Desenvolvimento Web 2
Introdução ao desenvolvimento web - 2 - iDez 2010
Python mudando o modo de desenvolver para a web - Marcos Daniel Petry
Python mudando o modo de desenvolver para a internet
PHP Classes - Desenvolvimento de sites de Web 2 0 em PHP para grandes audiências
Frameworks PHP
Frameworks de Desenvolvimento Web com PHP
Cache e Performance (in portuguese)
Frameworks Opensource: ferramentas para desenvolvimento rápido de aplicações Web
Melhorando a performance de aplicações com o uso do MemCache
Técnicas para ser escalável com PHP
Apache PHP MySQL
XPT Framework

Mais de Elton Minetto (20)

PDF
Go e Microserviços - Nascidos um para o outro
PDF
Object Calisthenics em Go
PDF
Programar != desenvolver software (v2)
PDF
Gerenciando uma startup no Github Projects
PDF
Clean Architecture
PDF
Serverless em Go
PDF
JAMstack
PDF
Clean architecture em Go - v2
PDF
Programar != desenvolver software
PDF
Clean Architecture em PHP
PDF
Clean Architecture in Golang
PDF
A jornada do desenvolvedor
PDF
Product and Technology
PDF
Code:Nation Tech Stack
PDF
Modernizando projetos legados usando APIs
PDF
12 factor in the PHP world
PDF
Building APIs using Go
PDF
Start you
PDF
O case da Compufácil e AWS
PDF
Introdução a Go
Go e Microserviços - Nascidos um para o outro
Object Calisthenics em Go
Programar != desenvolver software (v2)
Gerenciando uma startup no Github Projects
Clean Architecture
Serverless em Go
JAMstack
Clean architecture em Go - v2
Programar != desenvolver software
Clean Architecture em PHP
Clean Architecture in Golang
A jornada do desenvolvedor
Product and Technology
Code:Nation Tech Stack
Modernizando projetos legados usando APIs
12 factor in the PHP world
Building APIs using Go
Start you
O case da Compufácil e AWS
Introdução a Go

Último (19)

PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
Processos na gestão de transportes, TM100 Col18
PPTX
Aula 18 - Manipulacao De Arquivos python
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Custos e liquidação no SAP Transportation Management, TM130 Col18
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Aula04-Academia Heri- Tecnologia Geral 2025
Apple Pippin Uma breve introdução. - David Glotz
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Processos na gestão de transportes, TM100 Col18
Aula 18 - Manipulacao De Arquivos python
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
COBITxITIL-Entenda as diferença em uso governança TI
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Otimizador de planejamento e execução no SAP Transportation Management, TM120...

Desenvolvendo aplicações Web escaláveis com PHP

  • 1. quarta-feira, 23 de setembro de 2009
  • 2. Desenvolvendo aplicações Web escaláveis com PHP Elton Luís Minetto quarta-feira, 23 de setembro de 2009
  • 3. quarta-feira, 23 de setembro de 2009
  • 4. Quem?  Graduado e pós-graduado em Ciência da Computação. Cursando MBA em Gerenciamento de Projetos  Trabalha com PHP desde 2000  Autor dos livros Frameworks para Desenvolvimento em PHP e Grid Computing in Research and Education  Coordenador do PHPSC e membro do PHPBC  Gerente de Desenvolvimento do Drimio e professor na Unochapecó(Chapecó) quarta-feira, 23 de setembro de 2009
  • 5. Terminologia  Performance: a habilidade que uma aplicação tem de atingir um objetivo, como por exemplo responder no menor tempo possível  Capacidade: a carga total que uma aplicação pode suportar  Escalabilidade: a habilidade de uma aplicação manter a performance quando a carga de trabalho aumenta. É a junção da capacidade e da performance quarta-feira, 23 de setembro de 2009
  • 6. Ou… quarta-feira, 23 de setembro de 2009
  • 7. Ou...  Performance: a velocidade do carro  Capacidade: o limite de velocidade e o número de pistas da estrada  Escalabilidade: quantos carros e pistas eu posso adicionar sem diminuir a velocidade do tráfego  “Performance is a problem. Scaling your performance is a bigger problem” quarta-feira, 23 de setembro de 2009
  • 8. Camadas quarta-feira, 23 de setembro de 2009
  • 9. Web Servers  Apache: Prefork X Worker  Prefork  Usa fork(). Cada processo filho trata uma conexão  Grande uso de memória  Rápido  Bom para até duas CPUs  Worker  Apache 2.0 e superior  Múltiplas threads dentro de cada filho (poucos filhos)  Diminui o uso de memória  Mais escalável  Melhor com múltiplos processadores  Não funciona com PHP! quarta-feira, 23 de setembro de 2009
  • 10. Web Servers  “Usar servidores dedicados para conteúdo estático“ (Flickr)  Apache pode ser substituído por outro mais leve: lighttpd, tux, thttpd  Usar domínios diferentes para conteúdo estático e dinâmico. Exemplo:  http://www.drimio.com (Servidor Apache)  http://static.drimio.com (Servidor lighttpd)  Usa a possibilidade dos navegadores acessarem múltiplos domínios ao mesmo tempo. Não sobrecarrega o servidor de conteúdo dinâmico quarta-feira, 23 de setembro de 2009
  • 11. Dica  Apache + Lighttpd = Cura do Câncer! (by @guhelski)  No apache: ProxyRequests Off ProxyPreserveHost On ProxyPass /public http://0.0.0.0:8080/ ProxyPassReverse / http://0.0.0.0:8080/  Todas as requisições para arquivos estáticos (/public) são repassados automaticamente para o lighttpd quarta-feira, 23 de setembro de 2009
  • 12. MySQL  “Nenhum dos problemas de escalabilidade que enfrentaram era relacionado com PHP. Os maiores problemas encontrados eram relacionados com base de dados” (Digg)  “Sharding é usado para quebrar a base de dados em várias porções menores” (Digg)  “Fazer o tunning do MySQL durante a escolha da engine de armazenamento das tabelas. Usar InnoDB quando precisa de transações e MyISAM quando não precisa” (Digg)  “Desnormalização ou cacheamento são as únicas formas de gerar uma tag cloud em milissegundos para milhões de tags” (Flickr) quarta-feira, 23 de setembro de 2009
  • 13. MySQL  Usar replicação Master-Slave.  Dividir a carga entre servidores. As requisições de modificação (INSERT, UPDATE,DELETE) podem ser enviadas para o Master. Os dados são replicados para os Slaves. As requisições de leitura (SELECT) são enviadas direto para os Slave  Usar o tipo correto de dados na tabela:  INT x SMALLINT x TINYINT  CHAR x VARCHAR quarta-feira, 23 de setembro de 2009
  • 14. MySQL  Master-Slave tem o problema do tempo de sincronização. Resposta: sharding.  “Uma base de dados pode ser sharded por tabelas, dados ou faixas (ranges). É similar ao particionamento, mas possui algumas diferenças. Sharding envolve separar os dados em máquinas fisicamente distintas, enquanto que particionamento geralmente ocorre em mesmo hardware. MySQL não suporta nativamente sharding, mas sim tabelas particionadas, tabelas federadas (federated) e clusters.” quarta-feira, 23 de setembro de 2009
  • 15. quarta-feira, 23 de setembro de 2009
  • 16. PHP  Usar “boas práticas de programação”  echo é mais rápido que print  require_once() é lento  etc,etc  http://reinholdweber.com/?p=3  http://www.devolio.com/blog/archives/314-Practical-and- impractical-PHP-Optimizations.html quarta-feira, 23 de setembro de 2009
  • 17. PHP  PHP tem um compilador JIT que gera um código intermedário chamado opcode que é então interpretado. Por default essa compilação ocorre em todas as execuções do script. Para otimização e caching desse opcode, existem algumas soluções:  Pacote APC do PECL  XCache  Zend Platform ($$$) quarta-feira, 23 de setembro de 2009
  • 18. Cache  Memcached: é um sistema de cache de objetos em memória distribuída de alta performance.Ele foi desenvolvido de maneira que se consiga armazenar qualquer tipo de informação mas é largamente usado em aplicações web para armazenar conteúdos como resultados de queries SQL, sessões de usuários, arquivos CSS, etc.  É possível criar “memcached farms”, aumentando a escalabilidade quarta-feira, 23 de setembro de 2009
  • 19. Memcached com PHP <?php $memcache = new Memcache; $memcache->connect('localhost', 11211); $memcache->connect('localhost', 11212); $memcache->connect(’192.168.0.10', 11212); $conteudo = $memcache->get('estados'); if($conteudo === false) { $uf = array('SC','RS','SP'); $memcache->set('estados', $uf, false, 100) ; $conteudo = $uf; } var_dump($conteudo); ?> quarta-feira, 23 de setembro de 2009
  • 20. Memcached - Dicas  Existem 3 extensões para conectar o PHP com o Memcached:  http://pecl.php.net/package/memcache (estável)  http://pecl.php.net/package/memcached (estável com mais opções e mais rápido)  http://www.modron.net/~dina/ezmemcache/ (novo mas com bom suporte a UDP)  No Drimio usamos: (ainda em testes. Não faça isso em casa!)  memcached via TCP para salvar os ítens  ezmemcache via UDP para fazer a leitura. Mais rápido para muitas conexões simultâneas quarta-feira, 23 de setembro de 2009
  • 21. 80-90% of the end-user response time is spent on the frontend. quarta-feira, 23 de setembro de 2009
  • 22. Javascript  “Algumas pessoas reclamam que o Digg é lento. Mas isso é mais devido ao uso de grandes bibliotecas javascript e não da arquitetura de backend (Digg)”  JavaScript pode ser comprimido  http://developer.yahoo.com/yui/compressor/  Usar compressão no Apache. quarta-feira, 23 de setembro de 2009
  • 25. Imagens  Editores de imagens possuem grandes ferramentas para otimizar o tamanho do arquivo sem perder qualidade visual. Mesmo assim elas adicionam informações extra no documento, como nome da ferramenta, data de criação, etc.  O site Smushit.com permite fazer upload de uma imagem ou indicar uma URL com a imagem a ser otimizada. Lançado em 10/2008 por pesquisadores do Yahoo! Exceptional Performance Team. quarta-feira, 23 de setembro de 2009
  • 26. Métricas quarta-feira, 23 de setembro de 2009
  • 27. Métricas quarta-feira, 23 de setembro de 2009
  • 28. Métricas quarta-feira, 23 de setembro de 2009
  • 29. Métricas - Drimio  Gráfico de CPU de um dos servidores quarta-feira, 23 de setembro de 2009
  • 30. Métricas - Drimio  Gráfico de CPU de um dos servidores Alerta quarta-feira, 23 de setembro de 2009
  • 31. Métricas - Drimio  Gráfico de CPU de um dos servidores Pânico Alerta quarta-feira, 23 de setembro de 2009
  • 32. Métricas - Drimio  Gráfico de CPU de um dos servidores Pânico Alerta Cool! quarta-feira, 23 de setembro de 2009
  • 33. Ferramentas  Apache ab,Siege, JMeter (aplicação)  Ganglia,Nagios, MRTG, SNMP (S.O. e serviços)  Firebug e YSlow (javascript, aplicação)  Xdebug (profiling do PHP)  Outras... quarta-feira, 23 de setembro de 2009
  • 34. Arquitetura  Load Balancers  Cache servers  Bancos de dados Master/Slave, Sharding  Scale-Out Wins Over Scale- Up  (escalar horizontalmente adicionando mais máqui nas é melhor do que verticalmente adicionando mais memória/CPU)  quarta-feira, 23 de setembro de 2009
  • 35. Arquitetura  Sobre o Youtube: “Eles seguiram uma evolução comum: servidor único, único master e múltiplos slaves para leitura e depois particionaram a base de dados.” quarta-feira, 23 de setembro de 2009
  • 37. Arquitetura – Observações  Como agora um cliente pode ser atendido por diversos servidores Web durante o uso, as sessões dos usuários devem ser salvas no banco de dados ou nos servidores de cache (Memcached)  O MySQL Master é um SPOF( Single Point of Failure) – adicionar mais Masters em um esquema de replicação Master/Master. Ou usar sharding  Diversos servidores de cache podem ser adicionados quarta-feira, 23 de setembro de 2009
  • 38. Lições Aprendidas  Dividir a carga  Usar servidores dedicados para conteúdo estático  Ao invés de comprar máquinas grandes e centralizadas, é melhor comprar um monte de pequenas e baratas.  Base de dados é um gargalo. Atacar e corrigir consultas lentas  Coletar várias estatísticas de performance  Usar InnoDB quando precisa de transações e MyISAM quando não precisa quarta-feira, 23 de setembro de 2009
  • 39. Lições Aprendidas  Fazer medições realísticas. Capacity planning deve ser feito baseado em dados reais e não abstratos.  Começar lentamente. Não comprar muito equipamento apenas porque está apavorado/feliz com o fato de que o seu site vai explodir.  Descobrir o máximo de cada servidor para poder saber se está perto do limite quarta-feira, 23 de setembro de 2009
  • 40. Receita para tratar crescimento rápido while (true) { identify_and_fix_bottlenecks(); drink(); sleep(); notice_new_bottleneck(); } Fonte: YouTube Team quarta-feira, 23 de setembro de 2009
  • 41. Referências  http://developer.yahoo.com/performance/  http://highscalability.com/unorthodox-approach- database-design-coming-shard  http://blog.feliperibeiro.com/2008/04/slides-da- palestra-php-para-desenvolvimento-de-aplicacoes-de- grande-porte.html  http://www.xdebug.org  http://devzone.zend.com/content/zendcon_07_slides/ White_Eli_zendcon-2007-high-perf.pdf  http://jst.pbwiki.com/  http://www.slideshare.net/jallspaw/velocity2008- capacity-management1-484676 quarta-feira, 23 de setembro de 2009
  • 42. Contato <?php $card = array( ‘nome’ => ‘Elton Luís Minetto’, ‘site’ => ‘http://www.eltonminetto.net’, ‘e-mail’ => ‘elton.minetto@drimio.com’, ‘fone’ => ‘(47) 9189 6359’, ‘twitter’ => ‘eminetto’, ); var_dump($card); ?> quarta-feira, 23 de setembro de 2009
  • 43. Perguntas? quarta-feira, 23 de setembro de 2009