iotop, amigo das horas que o LED do HD não apaga

Servidor lento, mal acessando remotamente, um simples ls é o suficiente pra levar vários segundos executando… abrir um programa então, nem pensar… vários minutos, o tempo para acender um cigar ou tomar um café.

Você, não entendendo o que se passa, vai dar uma olhada no servidor, as vezes já com a intenção de resetar, e repara que o LED do HD parece com a luz do Power, mas, vermelha…

E pensa: Ops, tem algo errado!

The english version is here

Em situações como essas onde há uma intensa atividade de disco, vêm uma pergunta sórdida “E agora José?”, como identificar o que está acessando tanto o disco?

Existem ferramentas próprias para isso, como o iostat e o vmstat colunas bi e bo.

Iostat é uma ferramenta que é uma mão na roda para casos assim mas a interpretação dos valores e forma diposta na tela não é da mais amigável.

Para isso, existe uma ferramenta, o iotop, que faz um interface muito bacana dos dados de I/O. Utiliza os próprios valores que o kernel passa e apresenta de forma bastante elegante.

iotop_small

Precisa ter o Python >= 2.5 e o kernel do Linux >= 2.6.20 com as opções habilitadas

  • CONFIG_TASKSTATS
  • CONFIG_TASK_DELAY_ACCT
  • CONFIG_TASK_IO_ACCOUNTING

Pré-requisitos

wget http://guichaz.free.fr/iotop/files/iotop-0.3.1.tar.bz2
tar jxvf iotop-0.3.1.tar.bz2 -C /usr/src
cd /usr/src/iotop-0.3.1/

Para executar o programa sem instalar, é só chamar via linha de comando:

./iotop.py

Caso o seguinte erro aconteça:

Traceback (most recent call last):
  File "./iotop.py", line 8, in ?
    from iotop.ui import main
  File "/usr/src/iotop-0.3.1/iotop/ui.py", line 12, in ?
    from iotop.data import find_uids, TaskStatsNetlink, ProcessList
  File "/usr/src/iotop-0.3.1/iotop/data.py", line 12, in ?
    from iotop import ioprio, vmstat
  File "/usr/src/iotop-0.3.1/iotop/ioprio.py", line 1, in ?
    import ctypes

É por que você não possui o python instalado ou não é a versão 2.5 que é a recomendável, será necessário instalá-lo.

Instalando o Python 2.5 no Red Hat 5.3 / CentOS 5.3

O Red Hat 5 / CentOS 5 vêm com o python 2.4 por padrão. Não é legal simplesmente instalar em cima uma nova versão do python, ao invés disso, estou disponibilizando aqui os RPMs do Python 2.5 para o Red Hat 5 / CentOS 5 que será instalado num diretório próprio, em /usr/bin/python25, assim os scripts que o Yum e outros scripts utilizam o python 2.4 não serão prejudicados.

A notícia é que sempre que você precisar utilizar a nova versão do python 2.5 terá que alterar o PATH que chama o interpretador. Antes isso, que todo o sistema instável, né?

Se você usa a versão 64bits do Red Hat 5.3 ou CentOS 5.3 (x64), então, você deve baixar o RPM Source do python25 aqui python25-2.5.1-fogonacaixadagua2.src.rpm e compilar para que seja compatível com a versão 64 bits.

Pra fazer é simples. Instale o source e compile com o rpmbuild

rpm -ivh python25-2.5.1-fogonacaixadagua2.src.rpm
rpmbuild -bb /usr/src/redhat/SPECS/python.spec

Os binários serão gerados no diretório /usr/src/redhat/RPMS e proceda com a instalação normal de um rpm, utilizando o comando rpm -ivh ou pelo yum.

Executando o iotop.py

Com o python25 instalado, é hora de modificar o script iotop.py e alterar o caminho do interpretador na primeira linha, que passa de

#!/usr/bin/python

para

#!/usr/bin/python25

Ok, hora de executar o script

./iotop.py

Se algum dos pré-requisitos não forem satisfeitos, uma mensagem como essa irá pipocar na tela informando o que falta.

Could not run iotop as some of the requirements are not met:
- Python >= 2.5 for AF_NETLINK support: Found
- Linux >= 2.6.20 with I/O accounting support (CONFIG_TASKSTATS, CONFIG_TASK_DELAY_ACCT, CONFIG_TASK_IO_ACCOUNTING): Not found

Python 2.5 está OK, mas o kernel não está.

Simples, compilar o kernel com essa opções.

Para compilar um novo kernel, existe um post aqui nesse site que explica isso, aqui só mostrarei onde estão as opções a serem consideradas, compilar e instalar o kernel é com você agora ;)

General setup  --->
...
[*] Export task/process statistics through netlink (EXPERIMENTAL)
[*]   Enable per-task delay accounting (EXPERIMENTAL)
[*]   Enable extended accounting over taskstats (EXPERIMENTAL)
[*]     Enable per-task storage I/O accounting (EXPERIMENTAL)
...

Screenshot-3

Kernel 2.6.30.5 (rpm) com suporte à estatísticas dos processos e pronto para ser usado com o iotop

Pra instalar

rpm -ivh kernel-2.6.30.5fogonacaixadagua-1.i386.rpm

e caso você já tenha instalado esse kernel, deverá gerar a imagem initrd novamente e utilizar a flag --force no comando rpm -ivh --force.

iotop em funcionamento

Screenshot-root@localhost:-usr-src-iotop-0.3.1

Instalando o iotop

Entre no diretório onde descompactou o iotop-0.3.1 e execute o comando ./setup.py install

cd /usr/src/iotop-0.3.1
./setup.py install

Como foi instalada a versão 2.5 do Python, se você tentar executar o comando /usr/bin/iotop será agraciado com o seguinte erro

Traceback (most recent call last):
File "/usr/bin/iotop", line 4, in <module>
import pkg_resources
ImportError: No module named pkg_resources

Pra resolver esse impasse, é bem simples, no diretório onde foi descompactado o iotop, no caso /usr/src/iotop-0.3.1 copie o diretório iotop para /usr/lib/python-2.5

cd /usr/src/iotop-0.3.1
cp -Rp iotop /usr/lib/python2.5/

E por fim, edite o arquivo /usr/bin/iotop e altere a linha do interpretador

de

#!/usr/bin/python

para

#!/usr/bin/python25

Ok, iotop instalado.

Share this post

Join the conversation