SlideShare uma empresa Scribd logo
1 de 43
Baixar para ler offline
sábado, 27 de junho de 2009
Desenvolvendo aplicações Web escaláveis




                                                FISL 2009
                                       Elton Luís Minetto


sábado, 27 de junho de 2009
sábado, 27 de junho de 2009
sábado, 27 de junho 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 do livro Frameworks para Desenvolvimento em
         PHP - Editora Novatec
        Coordenador do PHPSC e membro do PHPBC
        Gerente de Desenvolvimento do Drimio e professor
         na Sociesc (Joinville)/Unochapecó(Chapecó)




sábado, 27 de junho de 2009
Drimio

        Uma Rede Social que catalisa e amplia o
         relacionamento entre consumidor e marca.
        Usuários podem compartilhar vídeos, links, imagens,
         notícias, enviar mensagens e participar de fórum
         sobre suas marcas de maior afinidade.
        Integração com Youtube, Twitter, Google Search,
         Yahoo Search, Flickr, leitura e geração de RSS/Atom.
        Versão mobile com suporte a iPhone, Nokia N95,
         Blackberry e outros dispositivos
        Crescimento de 300% no número de usuários nas
         primeiras 24 horas depois do lançamento
        Triplicou o número de pageviews nas primeiras 24
         horas depois do lançamento

sábado, 27 de junho 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




sábado, 27 de junho de 2009
Ou…




sábado, 27 de junho 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”




sábado, 27 de junho de 2009
Camadas




sábado, 27 de junho 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




sábado, 27 de junho 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




sábado, 27 de junho 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)

sábado, 27 de junho 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




sábado, 27 de junho 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.”




sábado, 27 de junho de 2009
sábado, 27 de junho 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




sábado, 27 de junho 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 ($$$)




sábado, 27 de junho 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




sábado, 27 de junho de 2009
Memcache 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);
       ?>




sábado, 27 de junho de 2009
80-90% of the end-user response time is spent on
       the frontend.




sábado, 27 de junho 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.




sábado, 27 de junho de 2009
Bibliotecas Javascript




sábado, 27 de junho de 2009
Bibliotecas Javascript




sábado, 27 de junho 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.




sábado, 27 de junho de 2009
Métricas




sábado, 27 de junho de 2009
Métricas




sábado, 27 de junho de 2009
Métricas




sábado, 27 de junho de 2009
Métricas - Drimio

        Gráfico de CPU de um dos servidores




sábado, 27 de junho de 2009
Métricas - Drimio

        Gráfico de CPU de um dos servidores




                              Alerta




sábado, 27 de junho de 2009
Métricas - Drimio

        Gráfico de CPU de um dos servidores



                                       Pânico

                              Alerta




sábado, 27 de junho de 2009
Métricas - Drimio

        Gráfico de CPU de um dos servidores



                                       Pânico

                              Alerta
                                                Cool!




sábado, 27 de junho 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...




sábado, 27 de junho 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) 




sábado, 27 de junho 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.”




sábado, 27 de junho de 2009
Arquitetura




sábado, 27 de junho 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




sábado, 27 de junho 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




sábado, 27 de junho 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




sábado, 27 de junho de 2009
Receita para tratar crescimento rápido

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



       Fonte: YouTube Team


sábado, 27 de junho 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


sábado, 27 de junho 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);
       ?>


sábado, 27 de junho de 2009
Perguntas?




sábado, 27 de junho de 2009

Mais conteúdo relacionado

Semelhante a App Web Escalaveis Fisl

Desenvolvendo aplicações Web escaláveis com PHP
Desenvolvendo aplicações Web escaláveis com PHPDesenvolvendo aplicações Web escaláveis com PHP
Desenvolvendo aplicações Web escaláveis com PHPElton Minetto
 
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsJava script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsVinicius Reis
 
Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...
Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...
Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...Tchelinux
 
Multithreaded tecnologia
Multithreaded tecnologia Multithreaded tecnologia
Multithreaded tecnologia J Chaves Silva
 
Otimização de infra estrutura para hospedagem de websites
Otimização de infra estrutura para hospedagem de websitesOtimização de infra estrutura para hospedagem de websites
Otimização de infra estrutura para hospedagem de websitesFabiano Weimar
 
PHP, Gearman e Memcache
PHP, Gearman e MemcachePHP, Gearman e Memcache
PHP, Gearman e MemcacheAndre Golvea
 
Infraestrutura em nuvem com Amazon Web Services (AWS)
Infraestrutura em nuvem com Amazon Web Services (AWS)Infraestrutura em nuvem com Amazon Web Services (AWS)
Infraestrutura em nuvem com Amazon Web Services (AWS)Infosimples
 
Qcon 2013 - Walmart Frontend Solution using Node.js
Qcon 2013 - Walmart Frontend Solution using Node.jsQcon 2013 - Walmart Frontend Solution using Node.js
Qcon 2013 - Walmart Frontend Solution using Node.jsJorge Walendowsky
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHPFlávio Lisboa
 
Apresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemApresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemRodrigo Valerio
 
Aws sao paulo summit 2015 elasti cache avancado
Aws sao paulo summit 2015   elasti cache avancadoAws sao paulo summit 2015   elasti cache avancado
Aws sao paulo summit 2015 elasti cache avancadoAmazon Web Services LATAM
 
Treinamento de Performance and tuning
Treinamento de Performance and tuningTreinamento de Performance and tuning
Treinamento de Performance and tuningDell Technologies
 
MySQL - o banco de dados open source mais popular do mundo
MySQL - o banco de dados open source mais popular do mundoMySQL - o banco de dados open source mais popular do mundo
MySQL - o banco de dados open source mais popular do mundoMySQL Brasil
 
JBoss-WildFly - Avançado
JBoss-WildFly - AvançadoJBoss-WildFly - Avançado
JBoss-WildFly - AvançadoAdriano Schmidt
 
Introdução ao desenvolvimento Web
Introdução ao desenvolvimento WebIntrodução ao desenvolvimento Web
Introdução ao desenvolvimento WebSérgio Souza Costa
 
MySQL: o banco de dados open source mais popular do mundo
MySQL: o banco de dados open source mais popular do mundoMySQL: o banco de dados open source mais popular do mundo
MySQL: o banco de dados open source mais popular do mundoMySQL Brasil
 
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaTécnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaAlexandre Tarifa
 

Semelhante a App Web Escalaveis Fisl (20)

Desenvolvendo aplicações Web escaláveis com PHP
Desenvolvendo aplicações Web escaláveis com PHPDesenvolvendo aplicações Web escaláveis com PHP
Desenvolvendo aplicações Web escaláveis com PHP
 
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsJava script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
 
Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...
Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...
Desenvolva Sistemas Embutidos com Software Livre - Carlos A. M. dos Santos e ...
 
Multithreaded tecnologia
Multithreaded tecnologia Multithreaded tecnologia
Multithreaded tecnologia
 
Otimização de infra estrutura para hospedagem de websites
Otimização de infra estrutura para hospedagem de websitesOtimização de infra estrutura para hospedagem de websites
Otimização de infra estrutura para hospedagem de websites
 
PHP, Gearman e Memcache
PHP, Gearman e MemcachePHP, Gearman e Memcache
PHP, Gearman e Memcache
 
XPT Framework
XPT FrameworkXPT Framework
XPT Framework
 
Infraestrutura em nuvem com Amazon Web Services (AWS)
Infraestrutura em nuvem com Amazon Web Services (AWS)Infraestrutura em nuvem com Amazon Web Services (AWS)
Infraestrutura em nuvem com Amazon Web Services (AWS)
 
Qcon 2013 - Walmart Frontend Solution using Node.js
Qcon 2013 - Walmart Frontend Solution using Node.jsQcon 2013 - Walmart Frontend Solution using Node.js
Qcon 2013 - Walmart Frontend Solution using Node.js
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHP
 
Apresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemApresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvem
 
Aws sao paulo summit 2015 elasti cache avancado
Aws sao paulo summit 2015   elasti cache avancadoAws sao paulo summit 2015   elasti cache avancado
Aws sao paulo summit 2015 elasti cache avancado
 
Treinamento de Performance and tuning
Treinamento de Performance and tuningTreinamento de Performance and tuning
Treinamento de Performance and tuning
 
MySQL - o banco de dados open source mais popular do mundo
MySQL - o banco de dados open source mais popular do mundoMySQL - o banco de dados open source mais popular do mundo
MySQL - o banco de dados open source mais popular do mundo
 
Apresentação do Curso
Apresentação do CursoApresentação do Curso
Apresentação do Curso
 
JBoss-WildFly - Avançado
JBoss-WildFly - AvançadoJBoss-WildFly - Avançado
JBoss-WildFly - Avançado
 
Introdução ao desenvolvimento Web
Introdução ao desenvolvimento WebIntrodução ao desenvolvimento Web
Introdução ao desenvolvimento Web
 
MySQL: o banco de dados open source mais popular do mundo
MySQL: o banco de dados open source mais popular do mundoMySQL: o banco de dados open source mais popular do mundo
MySQL: o banco de dados open source mais popular do mundo
 
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaTécnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
 
Framework struts2v2.5
Framework struts2v2.5Framework struts2v2.5
Framework struts2v2.5
 

Mais de Elton Minetto

Go e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outroGo e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outroElton Minetto
 
Object Calisthenics em Go
Object Calisthenics em GoObject Calisthenics em Go
Object Calisthenics em GoElton Minetto
 
Programar != desenvolver software (v2)
Programar != desenvolver software (v2)Programar != desenvolver software (v2)
Programar != desenvolver software (v2)Elton Minetto
 
Gerenciando uma startup no Github Projects
Gerenciando uma startup no Github ProjectsGerenciando uma startup no Github Projects
Gerenciando uma startup no Github ProjectsElton Minetto
 
Clean architecture em Go - v2
Clean architecture em Go - v2Clean architecture em Go - v2
Clean architecture em Go - v2Elton Minetto
 
Programar != desenvolver software
Programar != desenvolver softwareProgramar != desenvolver software
Programar != desenvolver softwareElton Minetto
 
Clean Architecture em PHP
Clean Architecture em PHPClean Architecture em PHP
Clean Architecture em PHPElton Minetto
 
Clean Architecture in Golang
Clean Architecture in GolangClean Architecture in Golang
Clean Architecture in GolangElton Minetto
 
A jornada do desenvolvedor
A jornada do desenvolvedorA jornada do desenvolvedor
A jornada do desenvolvedorElton Minetto
 
Product and Technology
Product and TechnologyProduct and Technology
Product and TechnologyElton Minetto
 
Code:Nation Tech Stack
Code:Nation Tech StackCode:Nation Tech Stack
Code:Nation Tech StackElton Minetto
 
Modernizando projetos legados usando APIs
Modernizando projetos legados usando APIsModernizando projetos legados usando APIs
Modernizando projetos legados usando APIsElton Minetto
 
12 factor in the PHP world
12 factor in the PHP world12 factor in the PHP world
12 factor in the PHP worldElton Minetto
 
Building APIs using Go
Building APIs using GoBuilding APIs using Go
Building APIs using GoElton Minetto
 
O case da Compufácil e AWS
O case da Compufácil e AWSO case da Compufácil e AWS
O case da Compufácil e AWSElton Minetto
 

Mais de Elton Minetto (20)

Go e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outroGo e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outro
 
Object Calisthenics em Go
Object Calisthenics em GoObject Calisthenics em Go
Object Calisthenics em Go
 
Programar != desenvolver software (v2)
Programar != desenvolver software (v2)Programar != desenvolver software (v2)
Programar != desenvolver software (v2)
 
Gerenciando uma startup no Github Projects
Gerenciando uma startup no Github ProjectsGerenciando uma startup no Github Projects
Gerenciando uma startup no Github Projects
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Serverless em Go
Serverless em GoServerless em Go
Serverless em Go
 
JAMstack
JAMstackJAMstack
JAMstack
 
Clean architecture em Go - v2
Clean architecture em Go - v2Clean architecture em Go - v2
Clean architecture em Go - v2
 
Programar != desenvolver software
Programar != desenvolver softwareProgramar != desenvolver software
Programar != desenvolver software
 
Clean Architecture em PHP
Clean Architecture em PHPClean Architecture em PHP
Clean Architecture em PHP
 
Clean Architecture in Golang
Clean Architecture in GolangClean Architecture in Golang
Clean Architecture in Golang
 
A jornada do desenvolvedor
A jornada do desenvolvedorA jornada do desenvolvedor
A jornada do desenvolvedor
 
Product and Technology
Product and TechnologyProduct and Technology
Product and Technology
 
Code:Nation Tech Stack
Code:Nation Tech StackCode:Nation Tech Stack
Code:Nation Tech Stack
 
Modernizando projetos legados usando APIs
Modernizando projetos legados usando APIsModernizando projetos legados usando APIs
Modernizando projetos legados usando APIs
 
12 factor in the PHP world
12 factor in the PHP world12 factor in the PHP world
12 factor in the PHP world
 
Building APIs using Go
Building APIs using GoBuilding APIs using Go
Building APIs using Go
 
Start you
Start youStart you
Start you
 
O case da Compufácil e AWS
O case da Compufácil e AWSO case da Compufácil e AWS
O case da Compufácil e AWS
 
Introdução a Go
Introdução a GoIntrodução a Go
Introdução a Go
 

App Web Escalaveis Fisl

  • 1. sábado, 27 de junho de 2009
  • 2. Desenvolvendo aplicações Web escaláveis FISL 2009 Elton Luís Minetto sábado, 27 de junho de 2009
  • 3. sábado, 27 de junho de 2009
  • 4. sábado, 27 de junho de 2009
  • 5. Quem?  Graduado e pós-graduado em Ciência da Computação. Cursando MBA em Gerenciamento de Projetos  Trabalha com PHP desde 2000  Autor do livro Frameworks para Desenvolvimento em PHP - Editora Novatec  Coordenador do PHPSC e membro do PHPBC  Gerente de Desenvolvimento do Drimio e professor na Sociesc (Joinville)/Unochapecó(Chapecó) sábado, 27 de junho de 2009
  • 6. Drimio  Uma Rede Social que catalisa e amplia o relacionamento entre consumidor e marca.  Usuários podem compartilhar vídeos, links, imagens, notícias, enviar mensagens e participar de fórum sobre suas marcas de maior afinidade.  Integração com Youtube, Twitter, Google Search, Yahoo Search, Flickr, leitura e geração de RSS/Atom.  Versão mobile com suporte a iPhone, Nokia N95, Blackberry e outros dispositivos  Crescimento de 300% no número de usuários nas primeiras 24 horas depois do lançamento  Triplicou o número de pageviews nas primeiras 24 horas depois do lançamento sábado, 27 de junho de 2009
  • 7. 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 sábado, 27 de junho de 2009
  • 8. Ou… sábado, 27 de junho de 2009
  • 9. 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” sábado, 27 de junho de 2009
  • 10. Camadas sábado, 27 de junho de 2009
  • 11. 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 sábado, 27 de junho de 2009
  • 12. 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 sábado, 27 de junho de 2009
  • 13. 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) sábado, 27 de junho de 2009
  • 14. 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 sábado, 27 de junho de 2009
  • 15. 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.” sábado, 27 de junho de 2009
  • 16. sábado, 27 de junho de 2009
  • 17. 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 sábado, 27 de junho de 2009
  • 18. 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 ($$$) sábado, 27 de junho de 2009
  • 19. 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 sábado, 27 de junho de 2009
  • 20. Memcache 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); ?> sábado, 27 de junho de 2009
  • 21. 80-90% of the end-user response time is spent on the frontend. sábado, 27 de junho 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. sábado, 27 de junho 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. sábado, 27 de junho de 2009
  • 26. Métricas sábado, 27 de junho de 2009
  • 27. Métricas sábado, 27 de junho de 2009
  • 28. Métricas sábado, 27 de junho de 2009
  • 29. Métricas - Drimio  Gráfico de CPU de um dos servidores sábado, 27 de junho de 2009
  • 30. Métricas - Drimio  Gráfico de CPU de um dos servidores Alerta sábado, 27 de junho de 2009
  • 31. Métricas - Drimio  Gráfico de CPU de um dos servidores Pânico Alerta sábado, 27 de junho de 2009
  • 32. Métricas - Drimio  Gráfico de CPU de um dos servidores Pânico Alerta Cool! sábado, 27 de junho 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... sábado, 27 de junho 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)  sábado, 27 de junho 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.” sábado, 27 de junho de 2009
  • 36. Arquitetura sábado, 27 de junho 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 sábado, 27 de junho 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 sábado, 27 de junho 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 sábado, 27 de junho de 2009
  • 40. Receita para tratar crescimento rápido while (true) { identify_and_fix_bottlenecks(); drink(); sleep(); notice_new_bottleneck(); } Fonte: YouTube Team sábado, 27 de junho 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 sábado, 27 de junho 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); ?> sábado, 27 de junho de 2009
  • 43. Perguntas? sábado, 27 de junho de 2009