Archive for setembro \30\-02:00 2011

Monitorando consultas lentas no PostgreSQL

Posted on setembro 30, 2011. Filed under: PostgreSQL, Tips, Tuning |

Em um post anterior já vimos como monitorar consultas lentas no MySQL, vamos agora ver como habilitar o log de consultas lentas no PostgreSQL. Como já foi discutido, esse recurso é extremamente útil para identificar gargalos em aplicações, principalmente aquelas que recebem um alto tráfego de acesso. Identificar e otimizar consultas com alta duração, como por exemplo criando indíces, irá diminuir a carga de processamento do seu servidor.

Para habilitar o log de consultas lentas no postgres é bem simples. Edite o arquivo postgresql.conf, normalmente localizado em /etc/postgresql/8.4/main/postgresql.conf no caso do Ubuntu com postgresql versão 8.4 e identifique a linha:

#log_min_duration_statement = -1

Substitua por:

log_min_duration_statement = 500

Recarregue a configuração do postgresql:

service postgresql reload

Perceba que colocamos para logar todas consultas que durarem mais que meio segundo (500ms). Você pode ajustar esse valor de acordo com sua necessidade. Por exemplo, caso você tenha um site com alto tráfego de acesso e tiver várias consultas que durem mais que meio segundo, neste caso pode fazer uma grande diferença otimizar essas consultas. Sinta-se livre para aumentar ou diminuir esse valor de acordo com o ambiente de sua aplicação.

Para visualizar o log de consultas lentas, vá para o diretório de log do postgres e edite o arquivo de log mais recente. No meu caso o arquivo é /var/log/postgresql/postgresql-8.4-main.log. Abaixo é um exemplo de um registro que gerou o log de uma consulta com duração de 2041.457 ms:

2011-09-29 11:27:39 BRT LOG: duration: 2051.457 ms execute pdo_stmt_000000b4: select * from backuplog WHERE message LIKE '%xyz%'

Referências

http://www.postgresql.org/docs/8.4/static/runtime-config-logging.html

Ler Post Completo | Make a Comment ( None so far )

PHP – Opções de cache de opcode

Posted on setembro 28, 2011. Filed under: PHP, Tuning |

Como todos sabemos PHP é uma linguagem interpretada. Portanto toda vez que um script é executado, o engine do PHP precisa compilar o código fonte em algo que a linguagem de máquina possa entender. Resultando em um bytecode que no caso chamamos de opcode. O opcode é gerado em cada requisiçao. Imagine então o trabalho do php engine quando utilizamos um framework MVC onde existem vários arquivos para serem compilados em uma mesma requisição.

Para ajudar na otimização desse processo podemos utilizar um cache de opcode, da forma como vimos no post anterior sobre o APC. Mas como funciona exatamente um cache de opcode ? Quando uma nova requisição é realizada, antes do php compilar o código fonte, o software de cache intercepta e verifica se o opcode do script já existe no cache. Caso não exista, o sistema de cache passa para o php engine gerar o opcode e o armazena no cache. Nas requisições subsequentes para o mesmo script o opcode irá ser obtido à partir do cache e não será necessário ser compilado pelo engine do php novamente. Esse processo economiza de forma considerável o processamento de CPU no servidor. É claro que se houver mudanças no código fonte em um script que já tenha o opcode no cache, a mudança será identificada pelo sistema de cache que irá proceder com a devida atualização.

Já vimos em um post anterior como instalar e configurar o APC que é uma das opções disponíveis para cache de opcode. Abaixo vamos fazer uma análise breve de algumas das outras principais opções disponíveis.

Opções de aceleradores de código PHP

  • eAccelerator – É um fork do antigo e conhecido Turck MMCache.  Acelera o código PHP de 1 até 10 vezes. Suporta PHP 4 e 5, incluindo a versão 5.3. O projeto incluia também um PHP Encoder que foi descontinuado em 2006. Neste link é realizado um benchmarking comparando um desenpenho entre os caches APC, XCache e eAccelerator em uma aplicação rodando Drupal. O eAccelerator teve melhor desempenho nos requisitos de velocidade e utilização de memória. Com a utilização do cache a aplicação teve um ganho de velocidade em 3x.
  • APC – Alternative PHP Cache, é um cache de opcode livre e grátis, desenvolvido pela equipe de programadores do php. É o mais utilizado, distribuído através de um pacote PECL e será incluído no core do PHP à partir da versão 5.4. Fácil de instalar, principalmente em distribuições de Linux como o Ubuntu. Se você fizer uma pesquisa na internet sobre aceleradores php, o APC é o mais recomendado. Suporta todas versões do PHP.
  • XCache – É um cache bastante popular conhecido pelo desempenho e estabilidade. Foi criado pelo mesmo desenvolvedor do lighttpd. É muito comum em ambientes de produção que possuem grandes volumes de acesso. Esta disponível para as versões mais recentes do php, incluíndo  versões de php para Windows. Foi desenvolvido com o intuito de sanar as limitações existentes nas outras plataformas de cache de opcode.
  • Zend Server  –  É uma opção comercial que além de incluir o cache de opcode inclui diversas outras soluções interessantes para ajudar desenvolvedores. O configurador de cache do Zend_Server possui parâmetros interessantes que merecem atenção (Verificar este link). Ótima opção para quem deseja investir em uma ferramenta comercial para essa finalidade.

Conclusão

Na minha opinião APC, eAccelerator e XCache são ótimas opções de software livre de cache de opcode. Aconselho você experimentar essas opções e fazer sua escolha. Vejo muitos comentários positivos na internet sobre essas 3 opções.  Em minha experiência tive mais contato com APC portanto no momento é o meu favorito.  Utilizar um acelerador  para PHP aumenta significativamente o desempenho de  sua aplicação e geralmente a instalação de uma ferramenta desse tipo é simples.  Porém não se esqueça de dar atenção para outros métodos de otimização de sua aplicação. No meu blog existem várias dicas de tuning para melhorar o desempenho.

Referências

Espero que a leitura desse artigo junto com a referências abaixo te ajude a escolher a melhor opção de cache de opcode para sua necessidade.

http://www.ducea.com/2006/10/30/php-accelerators/
http://stackoverflow.com/questions/930877/apc-vs-eaccelerator-vs-xcache
http://2bits.com/articles/benchmarking-drupal-with-php-op-code-caches-apc-eaccelerator-and-xcache-compared.html

 

Ler Post Completo | Make a Comment ( None so far )

Usando APC (Alternative PHP Cache)

Posted on setembro 15, 2011. Filed under: PHP, Tuning | Tags:, , , |

APC, sigla de Alternative PHP Cache, é um cache de opcode que pode aumentar significativamente o desempenho da sua aplicação. Além de fazer o cache de variáveis/objetos, assim como o memcached, ele tem a função de fazer cache do próprio código compilado do php. De qual forma ? Para entender, é importante alguns conceitos básicos. Como todos sabemos, PHP é uma linguagem interpretada (Diferente de Java, C, etc.). Quando realizado uma requisição para uma página php, o engine do php lê o código fonte php, compila em um bytecode, chamado opcode, e finalmente o executa. Toda requisição passa por esse processo. O que o APC faz nesse processo ? Ele faz o cache do bytecode compilado (opcode) e o reutiliza nas requisições subsequêntes. Isto reduz o tempo de processamento no servidor. Em sites de alto tráfego, o desempenho pode melhorar significativamente.

O APC é distribuído através de um módulo PECL e pode ser facilmente instalado e habilitado em distribuições como Ubuntu através do comando abaixo:

$ sudo apt-get install php-apc

O comando acima irá instalar o módulo e reiniciar o apache automaticamente. Para checar se o APC foi instalado com sucesso e esta habilitado, crie um php com o comando phpinfo(); e verifique à presença da sessão apc conforme imagem abaixo:

phpinfo-apc

Junto com o pacote de instalação do APC é distribuído um script, apc.php, usado para administração do cache. Através dessa interface é possível visualizar à utilização do cache, como as variáveis e scripts contidos nele, entre outras coisas. Você precisa copiar o script apc.php para dentro do DocumentRoot do seu webserver. No Ubuntu pode ser feito da seguinte maneira:

$ cp /usr/share/doc/php-apc/apc.php.gz /var/www
$ cd /var/www
$ gunzip apc.php.gz

Edite o arquivo apc.php e especifique uma senha de sua preferência na linha 42 (no meu caso):

...
defaults('ADMIN_USERNAME','apc');                       // Admin Username
defaults('ADMIN_PASSWORD','password');          // Admin Password - CHANGE THIS TO ENABLE!!!

Acessando a interface administrativa do cache:

http://localhost/apc.php

Através da interface administrativa é possível visualizar informações relativas às páginas e variáveis em cache. É possível também limpar o cache do servidor (opcode) como também limpar o cache do usuário (referente à variáveis e objetos que o programador colocou no cache). Para limpar o cache é necessário logar como administrador através do link no canto superior direito. Para logar, utilize o usuário e senha setados no arquivo apc.php. É interessante navegar pelas opções para entender as informações ali contidas. Segue a tela administrativa:

Aconselho a limpar o cache de opcode, através do botão “Clear opcode Cache”, periodicamente. Essa opção esta disponível somente quando logado.

Exemplos de Utilização do cache

Assim como o memcached, podemos utilizar o apc para cache de dados na aplicação. Segue abaixo exemplo:

<?php

// verifica se os dados do usuário estão no cache
if ($usuarios = apc_fetch('usuarios')) {
        echo "Dados no Cache: ";
} else {
        // adiciona dados do usuário no cache
        $usuarios = array(
                array('id' => 1, 'nome' => 'Manuel', 'email' => 'manuel@xxxxyy.com.br', 'telefone' => '011-1111-1111'),
                array('id' => 2, 'nome' => 'Pereira', 'email' => 'pereira@xxxxyy.com.br', 'telefone' => '011-2222-2222'),
        );
        apc_add('usuarios', $usuarios);
}

echo "<pre>";
var_dump($usuarios);
echo "</pre>";

Ao acessar o script pela primeira vez, os dados são registrados no cache. Os acessos subsequentes obterão os dados do cache. Segue resultado:

Inserindo objetos no cache

Podemos também inserir objetos tranquilamente em nosso cache. As funções do apc já fazem a serialização do objeto antes de inserí-lo no cache e vice-versa na hora de obter o objeto do cache:

<?php

// classe para armazenar dados do usuario
class usuario {
        private $id;
        private $nome;
        private $email;
        private $telefone;

        public function setId($id) {
                $this->id = $id;
        }
        public function getId() {
                return $this->id;
        }

        public function setNome($nome) {
                $this->nome = $nome;
        }
        public function getNome() {
                return $this->nome;
        }

        public function setEmail($email) {
                $this->email = $email;
        }
        public function getEmail() {
                return $this->email;
        }

        public function setTelefone($telefone) {
                $this->telefone = $telefone;
        }
        public function getTelefone() {
                return $this->telefone;
        }
}

// verifica se objeto consta no cache
if ($usuario = apc_fetch('usuario')) {
        echo "Dados no Cache: ";
} else {
        // criar cache para objeto usuario
        $usuario = new Usuario();
        $usuario->setId(1);
        $usuario->setNome('Manuel');
        $usuario->setEmail('manuel@xxxxx.com.br');
        $usuario->setTelefone('11-1111-1111');

        apc_add('usuario', $usuario);
}

echo "<pre>";
echo $usuario->getId() . PHP_EOL;
echo $usuario->getNome() . PHP_EOL;
echo $usuario->getEmail() . PHP_EOL;
echo $usuario->getTelefone() . PHP_EOL;
echo "</pre>";

Resultado:

Mais algumas Dicas

Para limpar uma variável/objeto do cache:

apc_delete('usuarios');
apc_delete('usuario');

Limpando todos dados do Cache:

// limpando o cache de opcode
apc_clear_cache();

// limpando o cache do usuário
apc_clear_cache('user');

Armazenando variáveis no cache:

apc_store('usuario', $usuario);

A diferença entre apc_add e apc_store é que o apc_store sobrescreve o valor no cache caso o identificador já exista. O apc_add não sobrescreve dados já existentes no cache com o mesmo identificador.

Procurei demonstrar aqui uma introdução à utilização de cache no php com APC. Segue abaixo alguns links para se aprofundar mais:

http://www.php.net/apc
http://pecl.php.net/support.php
http://devzone.zend.com/article/12618

Ler Post Completo | Make a Comment ( 3 so far )

Liked it here?
Why not try sites on the blogroll...

%d blogueiros gostam disto: