1) O documento apresenta informações sobre um PHP Summer School ministrado por Nuno Loureiro, incluindo sua experiência e sobre desempenho de aplicações;
2) O documento discute arquitetura de desempenho cobrindo tópicos como conteúdo estático vs dinâmico, webservers, compressão e otimizações;
3) O documento também aborda otimizações no PHP como profiling, caching e escolha de código, além de bases de dados.
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
Performance (Web&PHP)
1. PHP Summer School
PHP Summer School
Desenvolvimento Orientado à Performance
Nuno Loureiro <nuno@co.sapo.pt>
http://blog.sig9.net/
20/07/2007
Nuno Loureiro <nuno@co.sapo.pt> 20/07/2007
2. PHP Summer School
About me
• Licenciatura em Eng. Sistemas e Computação
• Começou a usar Linux em 1995
• Começou a programar PHP em 1999
• Organizou o 1º Simpósio de Linux em 1999 - Simplinux
• Sócio-fundador da ETH em 1999
• Autor do artigo “Programming PHP with Security in Mind” na Linux Journal 10/2002
• Juntou-se à equipa do SAPO em 2002
• Programador do Webmail do SAPO
• Gestor técnico da plataforma de email do SAPO
• Zend Certified Engineer em 2005
Performance 2
3. PHP Summer School
Sumário - parte I
• Arquitectura
• Performance e Escalabilidade
• Conteúdo Estático vs Dinâmico
• Webserver
• Compressão de Conteúdo
• Optimizações de Compilador
• Tuning php.ini
• Compiler/Opcode Caching
• Bottlenecks
• Session Storage
• Benchmarking
Performance 3
4. PHP Summer School
Sumário - parte II
• PHP
• Profiling
• Caching
• Opções de código a considerar
• Regra 80/20
• Bases de Dados
• O que evitar e o que usar
Performance 4
5. PHP Summer School
Arquitectura
Performance e Escalabilidade
• Performance != velocidade de execução
• Performance = compromisso entre velocidade e escalabilidade
Performance 5
6. PHP Summer School
Arquitectura
Performance e Escalabilidade
Exemplo:
Script que leia um ficheiro binário de 5Mb e escreva outro ficheiro
com o conteúdo do primeiro mas codificado em base64
Performance 6
7. PHP Summer School
Arquitectura
Performance e Escalabilidade
Exemplo:
Script que leia um ficheiro binário de 5Mb e escreva outro ficheiro
com o conteúdo do primeiro mas codificado em base64
Exemplo A.php: implementação tendo em conta a velocidade
Exemplo B.php: implementação tendo em conta a escalabilidade
A.php B.php
Performance 6
8. PHP Summer School
Arquitectura
Performance e Escalabilidade
Performance 7
9. PHP Summer School
Arquitectura
Performance e Escalabilidade
• A.php: Leitura única do ficheiro => Mais rápido
• B.php: Múltiplas leituras do ficheiro => Mais lento
A.php B.php
Performance 7
10. PHP Summer School
Arquitectura
Performance e Escalabilidade
• A.php: Leitura única do ficheiro => Mais rápido
• B.php: Múltiplas leituras do ficheiro => Mais lento
No entanto,
• A.php: Leitura única do ficheiro => Mais memória usada (~=2x5Mb)
• B.php: Múltiplas leituras do ficheiro => Pouca memória usada
A.php B.php
Performance 7
11. PHP Summer School
Arquitectura
Performance e Escalabilidade
• A.php: Leitura única do ficheiro => Mais rápido
• B.php: Múltiplas leituras do ficheiro => Mais lento
No entanto,
• A.php: Leitura única do ficheiro => Mais memória usada (~=2x5Mb)
• B.php: Múltiplas leituras do ficheiro => Pouca memória usada
Com 100 instâncias em paralelo,
• A.php: Ocupa cerca de 1Gb RAM => Usa Swap => LENTO!
• B.php: Consumo de memória praticamente não cresce => Impacto na performance
pouco significativo => MAIS RAPIDO!
A.php B.php
Performance 7
12. PHP Summer School
Arquitectura
Conteúdo Estático vs Dinâmico
Performance 8
13. PHP Summer School
Arquitectura
Conteúdo Estático vs Dinâmico
Conteúdo Estático: Conteúdo Dinâmico:
• •
Não envolve processamento extra Envolve processamento extra
• •
Servido directamente pelo servidor Web Servidor Web => Engine que interpreta o script
• •
Mais leve e rápido Mais lento que conteúdo estático
• •
exemplos: imagens, HTML, Javascript exemplos: PHP Perl, Python, Ruby
,
Performance 8
14. PHP Summer School
Arquitectura
Conteúdo Estático vs Dinâmico
Conteúdo Estático: Conteúdo Dinâmico:
• •
Não envolve processamento extra Envolve processamento extra
• •
Servido directamente pelo servidor Web Servidor Web => Engine que interpreta o script
• •
Mais leve e rápido Mais lento que conteúdo estático
• •
exemplos: imagens, HTML, Javascript exemplos: PHP Perl, Python, Ruby
,
Para obter máxima Performance/Escalabilidade:
• Usar sempre que possível conteúdo estático (pre-executar os scripts e servir sempre o
conteúdo estático resultante)
• Quando não é possível usar apenas conteúdo estático, dividir página em componentes e
tornar estático os componentes que podem ser estáticos. (Ex: Portal com blocos de notícias)
• Mas, nem sempre precisamos deste tipo de solução. Existem também outras alternativas
tipo cache.
Performance 8
15. PHP Summer School
Arquitectura
Conteúdo Estático vs Dinâmico
Conteúdo Estático: Conteúdo Dinâmico:
• •
Não envolve processamento extra Envolve processamento extra
• •
Servido directamente pelo servidor Web Servidor Web => Engine que interpreta o script
• •
Mais leve e rápido Mais lento que conteúdo estático
• •
exemplos: imagens, HTML, Javascript exemplos: PHP Perl, Python, Ruby
,
Para obter máxima Performance/Escalabilidade:
• Usar sempre que possível conteúdo estático (pre-executar os scripts e servir sempre o
conteúdo estático resultante)
• Quando não é possível usar apenas conteúdo estático, dividir página em componentes e
tornar estático os componentes que podem ser estáticos. (Ex: Portal com blocos de notícias)
• Mas, nem sempre precisamos deste tipo de solução. Existem também outras alternativas
tipo cache.
Dica: devido às limitações de pipelining dos browsers
usar um domínio diferente para servir conteúdo estático
Performance 8
17. PHP Summer School
Arquitectura
Webserver
Arquitectura mais comum:
Apache
PHP
Apache + mod_php
• “A” da arquitectura LAMP
• Popular por algum motivo
• PHP está embutido no Apache
• Processos Apache ocupam mais RAM
• Se o Apache estiver a servir muitos
clientes lentos vai ter muita memória
ocupada inutilmente
Performance 9
18. PHP Summer School
Arquitectura
Webserver
Arquitectura mais comum: A ganhar bastante popularidade:
Lighttpd
Apache
PHP PHP
Apache + mod_php Lighttpd + php fcgi
• “A” da arquitectura LAMP • Rápido que se farta para conteúdo
• Popular por algum motivo estático.
• PHP está embutido no Apache • Separa as águas:
• Processos Apache ocupam mais RAM • Servidor HTTP + Servidor PHP
• Se o Apache estiver a servir muitos • Podemos criar um cluster de
clientes lentos vai ter muita memória servidores HTTP e outro para correr
ocupada inutilmente apenas PHP
• Se o Lighttpd estiver a servir muitos
clientes lentos, não há problema
Performance 9
19. PHP Summer School
Arquitectura
Webserver
Exemplo de uma Arquitectura escalável:
Performance 10
20. PHP Summer School
Arquitectura
Webserver
Dicas:
• Compilar apenas com os módulos necessários
• Desligar tudo o que não é necessário:
• Logs => I/O
• Se precisar de Logs:
• não converter IPs em Hostnames
• rodar os Logs
• Status/ExtendStatus
• Evitar tudo o que provoque mais do que um stat() por request
• Exemplos no Apache:
• Manter a lista do “DirectoryIndex” o mais pequena possível
• Desactivar o uso de .htaccess com “AllowOverride none”
Performance 11
22. PHP Summer School
Arquitectura
Compressão de Conteúdo
Compressão de Conteúdo
• A maioria dos Browsers suporta
• Páginas comprimidas são em média 7-10x mais pequenas
• Implementações:
• Apache 1 (mod_gzip / mod_deflate)
• Apache 2 (mod_deflate)
• Lighttpd (mod_compress)
• PHP:
• php.ini: zlib.output compression=1
• no script: ob_start(“ob_gzhandler”)
Performance 12
23. PHP Summer School
Arquitectura
Compressão de Conteúdo
Menos output ...
• usa menos largura de banda
• poupa €€€
• as páginas carregam mais rapidamente
• reduz IO de rede em sites com muito tráfego
Compressão de Conteúdo
• A maioria dos Browsers suporta
• Páginas comprimidas são em média 7-10x mais pequenas
• Implementações:
• Apache 1 (mod_gzip / mod_deflate)
• Apache 2 (mod_deflate)
• Lighttpd (mod_compress)
• PHP:
• php.ini: zlib.output compression=1
• no script: ob_start(“ob_gzhandler”)
Performance 12
24. PHP Summer School
Arquitectura
Optimizações de Compilador
Para máxima performance é crucial que todo o software seja
compilado de forma a usar o máximo do hardware disponível
• Activar todas as optimizações de compilador com o -O3
• Optimizar o código para o CPU usado via -march -mcpu
• Funcionalidades específicas do CPU via -msse -mmmx
-mfpmath=sse
• Desactivar dados para debug via -fomit-frame-pointer
Performance 13
25. PHP Summer School
Arquitectura
Tuning php.ini
• Settings aconselhados ** php.ini:
no
• register_globals = Off
• register_long_arrays = Off
• magic_quotes_gpc = Off
• variables_order = “GPCS”
• expose_php = Off
• register_argc_argv = Off
• always_populate_raw_post_data = Off **
• session.use_trans_sid = Off **
• session.auto_start = Off **
• session.gc_divisor = 1000 or 10000
• output_buffering = 4096
** Desligado por default
Performance 14
26. PHP Summer School
Arquitectura
Compiler/Opcode Caching
Performance 15
27. PHP Summer School
Arquitectura
Compiler/Opcode Caching
• O ciclo a branco acontece para cada ficheiro
incluído e não apenas para o ficheiro principal
• A compilação facilmente consome mais
tempo do que a execução.
Performance 15
28. PHP Summer School
Arquitectura
Compiler/Opcode Caching
• O ciclo a branco acontece para cada ficheiro
incluído e não apenas para o ficheiro principal
• A compilação facilmente consome mais
tempo do que a execução.
Compiler/Opcode Caching
• Cada script PHP é compilado apenas uma
única vez para cada revision.
• Reduz IO de ficheiros, os opcodes são lidos
da memória em vez de serem “parsed” do
disco.
• Os opcodes são optimizados para uma
execução mais rápida.
Performance 15
29. PHP Summer School
Arquitectura
Compiler/Opcode Caching
Opções mais populares para Opcode Cache:
• Alternative PHP Cache (APC) - http://pecl.php.net/package/APC
• pear install pecl.php.net/apc
• Adicionar “extension=apc.so” no php.ini
• XCache - http://xcache.lighttpd.net/wiki/GettingSource
• Zend Platform - http://www.zend.com/
Performance 16
30. PHP Summer School
Arquitectura
Bottlenecks
• Bottlenecks típicos de uma Arquitectura:
• IO de Disco
• Evitar logs ou gravar em disco diferente
• Drive T uning (hdparm / RAID)
• Usar RAM Disk para sessões ou para as sources
# Speed Up /tmp Directory
mount --bind -ttmpfs /tmp /tmp
# Accelerate Scripts Directory
mount --bind -ttmpfs /home/webroot /home/webroot
• IO de Rede
• Usar compressão de conteúdo
• Separar Redes e usar mais interfaces de rede
Performance 17
31. PHP Summer School
Arquitectura
Session Storage
Para um único servidor:
• Por default cada sessão de PHP é guardada em disco num ficheiro
separado
• Muitos ficheiros num directório reduz a velocidade de acesso
• Separar as sessões em múltiplos directórios
• session.save_path = quot;N;/pathquot;
• Usar sessões em memória (via Ramdisk, shared memory)
Para um cluster de servidores:
• Usar Memcache
• Usar o Session Clustering do Zend Platform
• Fazer stickyness por servidor e usar método convencional para sessões
Performance 18
32. PHP Summer School
Arquitectura
Benchmarking
Opções mais populares para Benchmarking de conteúdo:
Apache Benchmark - http://www.apache.org/
httperf
http://freshmeat.net/projects/httperf/
http_load
http://www.acme.com/software/http_load/
Performance 19
33. PHP Summer School
Sumário - parte II
• PHP
• Profiling
• Caching
• Opções de código a considerar
• Regra 80/20
• Bases de Dados
• O que evitar e o que usar
Performance 20
35. PHP Summer School
PHP
Profiling
PEAR Benchmark_Profiler
Result
Métodos mais úteis da class Pear::Benchmark_Profiler:
•start()
•stop()
•enterSection()
•leaveSection()
•display()
•getAllSectionsInformations()
Performance 22
37. PHP Summer School
PHP
Caching
O que é?
• Caching é o reconhecimento do facto que a maioria dos
dados dinâmicos não mudam cada vez que os pedem
Performance 23
38. PHP Summer School
PHP
Caching
O que é?
• Caching é o reconhecimento do facto que a maioria dos
dados dinâmicos não mudam cada vez que os pedem
Como funciona?
Performance 23
39. PHP Summer School
PHP
Caching
O que é?
• Caching é o reconhecimento do facto que a maioria dos
dados dinâmicos não mudam cada vez que os pedem
Como funciona?
Vantagens?
• Grande aumento de performance
• Diminuição na utilização de recursos
Performance 23
40. PHP Summer School
PHP
Caching
O que é?
• Caching é o reconhecimento do facto que a maioria dos
dados dinâmicos não mudam cada vez que os pedem
Como funciona?
Vantagens?
• Grande aumento de performance
• Diminuição na utilização de recursos
Desvantagens?
• Complexidade da Arquitectura
• Potencial para dados inconsistentes
Performance 23
41. PHP Summer School
PHP
Caching
Tipos de cache:
• Full Content Caching
• Partial Content Caching
• After Caching
• Permanent Caching
• HTP Header Caching
Implementações de cache:
• Zend Platform (parcial, total)
• PEAR::Cache_Lite
Performance 24
42. PHP Summer School
Opções de código a considerar
Profiling Results:
Como posso optimizar o script?
Performance 25
43. PHP Summer School
PHP
Opções de código a considerar
• Evitar usar Regular Expressions
• preg_match() => strpos()
• preg_replace() => str_replace() ou strstr()
• Usar echo em vez de print
• Usar pelicas em vez de aspas
• Usar ciclos while() em vez de for() e não usar funções nas condições
Performance 26
44. PHP Summer School
PHP
Opções de código a considerar
• Para Arrays Associativos usar foreach() em vez de while(list()= each())
Performance 27
45. PHP Summer School
Opções de código a considerar
Profiling Results:
Agora que já sabem, optimizem!
Performance 28
46. PHP Summer School
PHP
Opções de código a considerar
Profiling Results:
Ganho de 17.3%
em relação ao primeiro exemplo
Performance 29
47. PHP Summer School
PHP
80/20 rule
80% do teu código demora menos de
20% do tempo total de execução
• Não percas tempo a optimizar nada nos 80%
• Descobre o que são os 20% a optimizar e optimiza
Performance 30
48. PHP Summer School
Bases de Dados
O que evitar e o que usar
• Evitar:
• usar joins
• fazer um query por todos os campos para obter apenas um
• Usar:
• Ferramentas para analisar a execução de queries
• indexes nos campos apropriados
Performance 31
49. PHP Summer School
PHP Summer School
FIM!
Obrigado, perguntas?
Nuno Loureiro <nuno@co.sapo.pt>
http://blog.sig9.net/
20/07/2007
Nuno Loureiro <nuno@co.sapo.pt> 20/07/2007