Upload
others
View
80
Download
1
Embed Size (px)
Citation preview
Tuning Apache/MySQL/PHPpara Desenvolvedores
By Douglas V. PasquaZend Certified Engineer / LPI / SCJP
Objetivos
● Dicas de Tuning para Apache/MySQL e PHP. ● Parâmetros de configuração para tuning de Apache e MySQL ● Instalação e configuração de ferramentas de tuning. ● Análise de códigos PHP.● Identifcar Gargalos.● Voltado para desenvolvedores.
Nota do Google sobre Tuning
"Speeding up websites is important - not just to site owners, but to all Internet users. Faster sites create happy users and we´ve seen in our internal studies the when a site responds slowly, visitors spend less time there. But faster sites don´t just improve user experience; recent data shows that improving site speed also reduces operating costs. Like us, our users place a lot of value in speed - that´s why we´ve decided to take site speed int account in our search rankings. We use a variety of sources to determine the speed of a site relative to other sites". - Google9 Abril 2010
Tópicos Apache
● AllowOverride● ExtendedStatus ● SymLinks● KeepAlive● MaxClients
Tópicos MySQL
● Monitorando consultas lentas● max_connections● table_cache● query_cache_size● thread_cache_size
Tópicos PHP
● Identificando gargalos em aplicação PHP● memcached● Opções de aceleradores de código php● Usando APC (Alternative PHP Cache)● Caching com Zend_Cache● PHP e Computação em Nuvem
Apache
● AllowOverride● ExtendedStatus ● SymLinks● KeepAlive● MaxClients
Apache, AllowOverride
● Permite sobrescrever configurações do Apache através dos arquivos .htaccess:
AuthUserFile /home/pathto/.htpasswd AuthType Basic AuthName "Secret Place"
<LIMIT GET POST> require valid-user </LIMIT>
Apache, AllowOverride
● Caso habilitado, Apache terá que checar por arquivos .htaccess em todas requisições.
● Sempre que possível, manter desabilitado.
DocumentRoot /var/www <Directory /> AllowOverride None </Directory>
Apache, AllowOverride
● Transportar as configurações de .htaccess para o arquivo de configuração principal
<Directory /var/www/protegido> AuthUserFile /home/pathto/.htpasswd AuthType Basic AuthName "Secret Place"
<LIMIT GET POST> require valid-user </LIMIT> </Directory>
Apache
● AllowOverride● ExtendedStatus ● SymLinks● KeepAlive● MaxClients
Apache, ExtendedStatus
● Conhece o mod_status do Apache ?
Apache, ExtendedStatus
● Manter o parâmetro ExtendedStatus -> Off
Apache, ExtendedStatus
● status.conf: <IfModule mod_status.c> <Location /server-status> SetHandler server-status Allow from all </Location> ExtendedStatus Off <IfModule mod_proxy.c> ProxyStatus On </IfModule> </IfModule>
Apache
● AllowOverride● ExtendedStatus ● SymLinks● KeepAlive● MaxClients
Apache, SymLinks
● Diz ao Apache para seguir/não seguir links simbólicos.
● Manter desabilitado faz com que o Apache realize checagens extras. (verificando se o arquivo acessado é um link ou não)
DocumentRoot /www/htdocs <Directory /> Options FollowSymLinks </Directory>
Apache
● AllowOverride● ExtendedStatus ● SymLinks● KeepAlive● MaxClients
Apache, KeepAlive
● Habilita conexões persistentes no Apache. Manter habilitado para uma melhor perfomance.
KeepAlive On
Apache, KeepAlive
● Habilita conexões persistentes no Apache. Manter habilitado para uma melhor perfomance.
KeepAlive On
● MaxKeepAliveRequest, quantidade de conexões efetuadas por conexão. Manter um valor alto para melhor perfomance.
MaxKeepAliveRequests 10000
Apache, KeepAlive
● Habilita conexões persistentes no Apache. Manter habilitado para uma melhor perfomance.
KeepAlive On
● MaxKeepAliveRequest, quantidade de conexões efetuadas por conexão. Manter um valor alto para melhor perfomance.
MaxKeepAliveRequests 10000
● KeepAliveTimeout, número de segundos para aguardar nova conexão KeepAliveTimeout 3
Apache
● AllowOverride● ExtendedStatus ● SymLinks● KeepAlive● MaxClients
Apache, MaxClients
● Determina o limite máximo de conexões simultâneas no Apache.
● Determine o valor de acordo com os recursos do servidor. MaxClients ≈ (RAM - memória outros processos) / (média do processo apache)
Apache, MaxClients
MaxClients ≈ (RAM - memória outros processos) / (média do processo apache)
● RAM # free -m (6109184) ● Média de Memória do Apache
# ps -ylC apache2 --sort:rss (12000) ● Reservar memória para outros processos
819200
MaxClients = (6109184 - 819200) / 12000 MaxClients = 441
MySQL
● Monitorando consultas lentas● max_connections● table_cache● query_cache_size● thread_cache_size
MySQL, Consultas Lentas
● Habilitar o log de consultas lentas permite identificar gargalos de maneira simples.
● Para Habiltiar, editar o my.cnf e acrescentar:
[mysqld] ... log-slow-queries long_query_time = 1 log-slow-queries = /var/log/mysql-slow.log
MySQL, Consultas Lentas
● Exemplo de Log /var/log/mysql-slow.log: # Time: 110406 17:00:00 # Query_time: 9 Lock_time: 0 Rows_sent: 1 Rows_examined: 5643851 select count(*) from backuplog;
MySQL
● Monitorando consultas lentas● max_connections● table_cache● query_cache_size● thread_cache_size
MySQL, max_connections
● Determina o número máximo de conexões simultâneas no MySQL.
● Aumentar de acordo com a necessidade.
● Receber “Too many connections” significa que excedeu esse
limite.
● Aumentar esse parâmetro influência:○ Quantidade de Memória disponível.○ Quantidade de memória usada por cada conexão. ○ Número de file descriptors abertos.
MySQL, max_connections
● Para aumentar o número de conexões simultâneas: [mysqld] ... max_connections = 200
● Para diagnósticos das conexões em processo no momento: mysql> show processlist\G
MySQL
● Monitorando consultas lentas● max_connections● table_cache● query_cache_size● thread_cache_size
MySQL, table_cache
● Toda vez que o MySQL abre uma tabela, coloca ela em cache.
● table_cache define o número de tabelas abertas em cache.
● Está diretamente relacionado com o parâmetro max_connections: table_cache = max_connections * n
● n é o número máximo de tabelas usadas em relação à todas queries do seu sistema.
MySQL, table_cache
● table_cache é limitado pelo número de file descriptors disponiveis pelo S.O.
● Verificar número de file descriptors do S.O. (Linux):
# cat /proc/sys/fs/file-max
MySQL
● Monitorando consultas lentas● max_connections● table_cache● query_cache_size● thread_cache_size
MySQL, query_cache_size
● Quantidade de memória alocada para guardar resultado das queries.
● Por padrão o valor é 0 (Desabilitado).
● Os valores para esse parâmetro devem ser múltiplos de 1024.
● Cuidado para não setar para um valor muito alto. As threads
precisam fazer lock no cache durante updates.
● O valor mínimo é 40Kb, para alocação das estruturas.
MySQL, query_cache_size
[mysqld] ... query_cache_size = 128M
MySQL
● Monitorando consultas lentas● max_connections● table_cache● query_cache_size● thread_cache_size
MySQL, thread_cache_size
● Quantidade de threads em cache. (Conexões persistentes).
● Diminuir o máximo possível a criação de novas threads.
● Equação para testar a eficiência do cache: 100 - ((Threads_created / Connections) * 100) = 99%
MySQL, thread_cache_size
● Equação para testar a eficiência do cache: 100 - ((Threads_created / Connections) * 100) Threads_created Número de Threads criadas desde que o MySQL foi iniciado.
Connections Número total de conexões desde que o MySQL foi iniciado.
MySQL, thread_cache_size
Threads_created mysql> SHOW STATUS LIKE '%threads_created%';+------------------------+-------+| Variable_name | Value |+------------------------+-------+| Threads_created | 636 |+------------------------+-------+1 row in set (0.00 sec) Threads_created: 636
MySQL, thread_cache_size
Connections: mysql> SHOW STATUS LIKE '%connections%';+----------------------------+------------+| Variable_name | Value |+----------------------------+------------+| Connections | 24340093 || Max_used_connections | 636 |+----------------------------+------------+2 rows in set (0.00 sec) Connections: 24340093
MySQL, thread_cache_size
Threads_created: 636 Connections: 24340093 100 - ((636 / 24340093) * 100) = 99,99%
PHP
● Identificando gargalos em aplicação PHP● memcached● Opções de aceleradores de código php● Usando APC (Alternative PHP Cache)● Caching com Zend_Cache● PHP e Computação em Nuvem
PHP, Profiler
● O Profiler do xdebug permite identificar gargalhos e/ou partes mais lentas de sua aplicação.
● Ideal para saber em quais pontos você pode melhor o
desempenho.
PHP, Profiler
● Habilitando o Profiler do xdebug no PHP: $ sudo apt-get install php5-xdebug
PHP, Profiler
● Habilitando o Profiler do xdebug no PHP: $ sudo apt-get install php5-xdebug
● Editando o arquivo /etc/php5/apache2/conf.d/xdebug.ini: zend_extension=/usr/lib/php5/20090626/xdebug.so xdebug.profiler_enable = 1 xdebug.profiler_output_dir = /log/xdebug
PHP, Profiler
● Habilitando o Profiler do xdebug no PHP: $ sudo apt-get install php5-xdebug
● Editando o arquivo /etc/php5/apache2/conf.d/xdebug.ini: zend_extension=/usr/lib/php5/20090626/xdebug.so xdebug.profiler_enable = 1 xdebug.profiler_output_dir = /log/xdebug
● Finalizando: $ sudo chown www-data /log/xdebug $ sudo service apache2 restart
PHP, Profiler
PHP, Profiler
● Precisamos de um software para ajudar na análise dos logs do xdebug, webgrind
● Instalando WebGrind
$ cd /var/www $ sudo wget http://webgrind.googlecode.com/files/webgrind-release-1.0.zip $ unzip webgrind-release-1.0.zip
PHP, Profiler
●Configurando webgrind ● config.php:
○ $storageDir - Onde será armazenado os arquivos já processados. ○ $profileDir - Arquivos de log gerados pelo xdebug○ $defaultTimezone - Configuração do fuso horário,
America/Sao_Paulo
PHP, Profiler
PHP
● Identificando gargalos em aplicação PHP● memcached● Opções de aceleradores de código php● Usando APC (Alternative PHP Cache)● Caching com Zend_Cache● PHP e Computação em Nuvem
PHP, memcached
● Sistema de cache de alta perfomance com dados armazenados em memória.
PHP, memcached
● Sistema de cache de alta perfomance com dados armazenados em memória.
● Ideal para:
○ Fazer cache de dados de queries lentas do banco de dados.
PHP, memcached
● Sistema de cache de alta perfomance com dados armazenados em memória.
● Ideal para:
○ Fazer cache de dados de queries lentas do banco de dados.
● Instalando:
$ sudo apt-get install memcached $ sudo apt-get install php5-memcached
PHP, memcached
● Inserindo e obtendo dados do cache:
PHP, memcached
● Limpando dados do cache:
PHP, memcached
● Usando memcached para armazenar dados de sessão, php.ini: session.save_handler = memcached session.save_path = "127.0.0.1:11211"
PHP
● Identificando gargalos em aplicação PHP● memcached● Opções de aceleradores de código php● Usando APC (Alternative PHP Cache)● Caching com Zend_Cache● PHP e Computação em Nuvem
PHP, aceleradores de código
● O que é um acelerador de código ou mais especificamente um cache de Opcode ?
PHP, aceleradores de código
●APC - Alternative PHP Cache.○ Software Livre ○ Mantido pelos desenvolvedores do PHP.○ Distribuído através de um pacote PECL.○ Fácil de instalar em Linux baseados em Debian.○ Previsão para estar integrado junto com o PHP versão 5.4 ○ Interface de administração fácil de usar ○ Compatibilidade com Zend Optimizer ○ Fácil administração○ Suporte para Windows ○ Suporte para PHP 5.3
PHP, aceleradores de código
● eAccelerator○ Software Livre ○ Apresenta melhor desempenho que outros aceleradores de
código PHP e normalmente utiliza menos memória.○ Requer mais tempo de administração e mais ajustes finos
comparado com APC.○ Compátivel com Zend Optimizer ○ Suporte para PHP 5.3
PHP, aceleradores de código
●XCache○ Software Livre ○ Apresenta desempenho próximo do eAccelerator○ Mantido pelo mesmo desenvolvedor do lighttpd○ Suporte para Windows ○ Suporte para PHP 5.3
PHP, aceleradores de código
●Zend Server○ Opção comercial
○ Diversas outras opções para tuning:
■ Cache de dados■ Cache de conteúdo (html output)■ Otimização de download■ Monitoração■ Session HA (failover)
○ Várias outras fucionalidades
PHP
● Identificando gargalos em aplicação PHP● memcached● Opções de aceleradores de código php● Usando APC (Alternative PHP Cache)● Caching com Zend_Cache● PHP e Computação em Nuvem
PHP, APC
● Instalando: $ sudo apt-get install php-apc
PHP, APC
PHP, APC
● Instalando o administrador do Cache: $ cp /usr/share/doc/php-apc/apc.php.gz /var/www $ cd /var/www $ gunzip apc.php.gz
● Definindo senha de administração (apc.php):
PHP, APC
● Interface Administrativa:
PHP, APC
● Usando APC como cache de dados:
PHP, APC
● Mais algumas dicas de cache com APC:
PHP
● Identificando gargalos em aplicação PHP● memcached● Opções de aceleradores de código php● Usando APC (Alternative PHP Cache)● Caching com Zend_Cache● PHP e Computação em Nuvem
PHP, Zend_Cache
● Distribuído junto com o Zend Framework.
● Pode ser utilizado como Stand Alone ou junto com o MVC.
● Necessário especificar frontend e backend.
○ frontend, para acessar dados○ backend, para gerenciar os dados
PHP, Zend_Cache
● Frontend○Core ○Class ○ File ○ Function ○Output ○ Page○Capture
PHP, Zend_Cache
●Backend○ File ○ APC○ Zend Server○ XCache○ Sqllite○memcached ○ TowLevels○ Static
PHP, Zend_Cache
● Configurando frontend Core e backend File
PHP, Zend_Cache
● Obtendo e armazenando dados no Cache:
PHP, Zend_Cache
● Configurando frontend Class e backend File
PHP, Zend_Cache
● Utilizando objetos à partir do cache:
PHP, Zend_Cache
● Limpando dados do Cache:
PHP
● Identificando gargalos em aplicação PHP● memcached● Opções de aceleradores de código php● Usando APC (Alternative PHP Cache)● Caching com Zend_Cache● PHP e Computação em Nuvem
PHP, Cloud
● IaaS (Infrastructure-as-a-Service)○ Você é responsável pela infraestrutura○ Configuração de webserver, banco de dados, etc. ○ Usuário root
PHP, Cloud
● IaaS (Infrastructure-as-a-Service)○ Você é responsável pela infraestrutura○ Configuração de webserver, banco de dados, etc. ○ Usuário root
● PaaS (Plataforme-as-a-Service)
○ Foco no desenvolvimento da aplicação ○ Interação com a plataforma através de APIs, Webservice,
REST
PHP, Cloud
●Amazon○ Amazon S3 (Simple Storage Service)○ Simple Queue Service○ SimpleDB○ EC2 (Elastic Compute Cloud) ○ Auto Scaling
http://aws.amazon.com/sdkforphp/
PHP, Cloud
●Windows Azure○ Blob Storage○ Table Storage○ Queue Storage
http://phpazure.codeplex.com/
PHP, Cloud
●Outros○ Nirvanix○ Rackspace○ IBM SmartCloud
http://www.phpcloud.com
PHP, Cloud
●Zend_Cloud○ Componente do Zend Framework○ "SimpleCloud" ○ Portabilidade
■ Amazon■ Windows Azure■ Nirvanix
http://www.simplecloud.org http://framework.zend.com/manual/en/zend.cloud.html
PHP, Cloud
● Exemplo Serviço de Storage no Cloud com Zend_Cloud ● Realizar cadastro no link abaixo:
http://aws.amazon.com/s3/
PHP, Cloud
● Criando um bucket no console de WebService da Amazom
● Bucket seria equivalente ao drive ou partição do sistema operacional.
https://console.aws.amazon.com/s3/
PHP, Cloud
● Obter seu accesskey e secretkey no site da Amazom
● cloud.ini:
PHP, Cloud
● Armazenando arquivos no storage
PHP, Cloud
● Acessando os objetos no storage através de URL.
● Acesso somente arquivos com permissão pública para leitura: http://<bucket-name>.s3.amazonaws.com/imagens/zend-logo.png
ou http://s3.amazonaws.com/<bucket-name>/imagens/zend-logo.png
PHP, Cloud
● Acessando os objetos no storage