Profiling tools! Usar ou não usar… Os 5 minutos que mudam a experiência!

Este artigo pretende apresentar as vantagens da utilização de ferramentas de profiling no desenvolvimento de aplicações web em PHP,  bem como justificar a afirmação feita no título para ele pensado: “Os 5 minutos que mudam a experiência!”.

Introdução

Frequentemente, ao desenvolvermos aplicações web, deparamo-nos com problemas de desempenho. No entanto, ao tentarmos cegamente resolver esses problemas, podemos não obter resultados concretos e estáveis. Assim, para auxiliar e optimizar o nosso trabalho, dispomos de uma técnica a que damos o nome de profiling.

O profiling consiste na utilização de ferramentas e técnicas que permitam obter dados sobre a execução do código, por exemplo: tempo de execução de cada função, linha, ou pedido, quanta memória utilizada, tempo de execução de queries, etc.

Desta maneira pode-se avaliar todo o desempenho de uma aplicação, identificar possíveis bottlenecks no código, tudo isto antes de colocar a aplicação em “produção”, permitindo assim uma optimização do código, para se obter a sua melhor performance da aplicação e se evitarem desperdícios de tempo tanto na execução como na identificação posterior dos bottlenecks e subsequente optimização do código.

Existem várias ferramentas para realizar estas tarefas. Neste artigo optei por utilizar a Xdebug, complementada por algumas outras ferramentas sobre as quais vou falando ao longo do artigo.

Ambiente utilizado:
Sistema operativo GNU/Linux, distribuição Ubuntu 10.04 LTS, a correr num PC comum, com Apache2 e respectivas mods e MySQL.

Instalação

Primeiramente instala-se o Siege, que é uma ferramenta complementar (ferramenta de teste de carrega) que me permite ver quantos pedidos por segundo a minha aplicação recebe, e quanto tempo demora a responder.

Para instalar devo primeiramente fazer o download da última versão do Siege, para a home directory, através do endereço http://www.joedog.org/pub/siege/.

Uma vez feito o download, executo o seguinte conjunto de comandos na consola, na minha home directory:

tar -xvf siege-latest.tar.gz
cd siege-2.70/
./configure
make
sudo make install
siege.config

Ao executar o siege.config, irá ser criado um ficheiro .siegerc. Posso editar este ficheiro para alterar o local onde será armazenado o ficheiro de log do Siege. Caso não o faça, os ficheiros de log serão armazenados em /var/siege.log. É recomendável colocar os ficheiros de log a serem armazenados na nossa home directory, e altamente desaconselhável executar estas aplicações como root.

Existem outras configurações possíveis e interessantes que não serão abordadas, para não estender muito o artigo. Estarão sempre acessíveis no ficheiro .siegerc, onde podem ser activadas e desactivadas.

Uma vez instalado, utilizamos o seguinte comando, para executar o Siege durante 60 segundos com 100 ligações simultâneas (simuladas):

siege -c 100 -b -t60s http://localhost

O output deverá parecer-se com isto:

** SIEGE 2.70
** Preparing 5 concurrent users for battle.
The server is now under siege...
Lifting the server siege.. done.
Transactions: 491 hits
Availability: 100.00 %
Elapsed time: 59.70 secs
Data transferred: 0.51 MB
Response time: 1.02 secs
Transaction rate: 4.81 trans/sec
Throughput: 0.01 MB/sec
Concurrency: 4.92
Successful transactions: 491
Failed transactions: 0
Longest transaction: 1.45
Shortest transaction: 0.82

O output do Siege fica armazenado no ficheiro log, o que permite que se possa ir acompanhando a evolução do desenvolvimento, bem como perdas ou aumentos de performance sempre dentro de um ambiente de testes. Também se torna útil para se compararem resultados de testes, com mais ou menos utilizadores.

Publicado na edição 37 (PDF) da Revista PROGRAMAR.