Nesse post iremos usar iostat para ver se lentidão é causada por erro em disco dos nossos computadores ou servidores.
Será fácil descobrir se a lentidão vem de um disco? Nãããão! Digo já de antemão. Usaremos comandos como ioastat ou hdparm e eles fornecem resultados com um monte de palavras difíceis para novatos entenderem. Mas, não se preocupe. Procurarei explicar cada opção ou coluna de resultados que aparecerem.
iostat é uma ferramenta que exibe estatísticas de uso do disco, incluindo taxa de transferência, número de operações de leitura e gravação, entre outros. Com essa ferramente podemos monitorar a atividade do sistema de E/S (entrada/saída) no Linux.
Um dos principais motivos que uso o iostat é para me ajudar a diagnosticar problemas de desempenho relacionados à E/S, ou seja, leitura e escrita em discos do sistema.
Instalando iostat
Obtemos a ferramenta iostat ao instalarmos o pacote sysstat.
Para instalar o iostat no Debian e CentOS, você pode usar os seguintes comandos:
DEBIAN, UBUNTU e derivados
sudo apt-get update
sudo apt-get install sysstat
RED HAT, CENTOS e derivados
sudo yum install sysstat
Verificando lentidão, travamentos e gargalos usando iostat
Se executar somente iostat irá ser listado estatísticas de todos os discos conectados. Podemos executar iostat /dev/sdb para listar informações apenas desse dispositivo ou de iostat /dev/sd* para listar todos começados com sd.
Abaixo uso -h para ter informações mais legíveis.
maria@ti:~$ iostat -h /dev/sd* Linux 6.2.0-39-generic (ti) 09/01/2024 _x86_64_ (8 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 2,5% 0,0% 0,7% 0,1% 0,0% 96,7% tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd Device 7,24 43,1k 170,5k 125,2k 3,9G 15,6G 11,4G sda 7,24 43,1k 170,5k 125,2k 3,9G 15,6G 11,4G sda1 0,01 0,1k 0,0k 0,0k 11,1M 56,0k 0,0k sdb 0,00 0,1k 0,0k 0,0k 9,3M 56,0k 0,0k sdb1 0,08 0,4k 0,0k 0,0k 36,8M 8,0k 0,0k sdc 0,08 0,4k 0,0k 0,0k 34,1M 8,0k 0,0k sdc1 0,40 1,9k 0,0k 0,0k 181,5M 3,4M 0,0k sdd 0,39 1,8k 0,0k 0,0k 169,2M 3,4M 0,0k sdd1 0,01 0,1k 0,0k 0,0k 9,6M 0,0k 0,0k sdd3
Observe bem sobre o uso médio do processador na linha avg-cpu:
%user
representa a porcentagem de tempo que a CPU passa executando processos de usuário. Isso inclui o tempo gasto em aplicativos e programas executados pelo usuário. Se%user
for alto, isso sugere uma carga significativa de processos de usuário.%nice
indica a porcentagem de tempo da CPU gasta executando processos de usuário com prioridade “nice” (prioridade ajustada). Processos “nice” são aqueles com uma prioridade de execução inferior, o que significa que eles estão dispostos a esperar por recursos da CPU%system
representa a porcentagem de tempo que a CPU passa executando código do sistema, incluindo o kernel do sistema operacional e drivers de dispositivos.%iowait
indica a porcentagem de tempo em que a CPU está aguardando a conclusão de operações de entrada/saída (I/O). A sigla I/O vem de Input/Output ou entrada e saída de dados no disco. Se%iowait
for consistentemente alto, por exemplo, pode indicar um problema de I/O.%idle
indica a porcentagem de tempo em que a CPU está inativa, sem estar envolvida em nenhum trabalho. Quanto maior essa porcentagem, mais ociosa (sem fazer nada) está a CPU.
Vamos ver o significado de cada coluna dos dados relacionados com o disco:
- tps (transações por segundo):
tps
representa o número de transações de I/O concluídas por segundo. Essas transações podem incluir operações de leitura e gravação no sistema de arquivos, entre outras. - kB_read/s (kilobytes lidos por segundo):
kB_read/s
mostra a taxa de leitura em kilobytes por segundo. Indica a quantidade de dados lidos do disco por segundo. - kB_wrtn/s (kilobytes escritos por segundo):
kB_wrtn/s
mostra a taxa de gravação em kilobytes por segundo. Indica a quantidade de dados gravados no disco por segundo. - kB_dscd/s (kilobytes descartados por segundo):
kB_dscd/s
indica a taxa de descarte em kilobytes por segundo. Refere-se à quantidade de dados descartados por segundo, o que pode ocorrer em certas situações, como durante a operação de descarte (discard) em dispositivos de armazenamento. - kB_read (kilobytes lidos total):
kB_read
é o total acumulado de kilobytes lidos desde o início da execução doiostat
. - kB_wrtn (kilobytes escritos total):
kB_wrtn
é o total acumulado de kilobytes escritos desde o início da execução doiostat
. - kB_dscd (kilobytes descartados total):
kB_dscd
é o total acumulado de kilobytes descartados desde o início da execução doiostat
.
Esses dados são importantes, mas para lê-los corretamente devemos entender os limites do disco que estamos analisando. Quanto de tps podemos ter? Quanto de leitura e escrita? Muitas informações podem ser retiradas rótulo colado no próprio disco.
Uma dica é usar hdparm e olhar por “DMA” ou “PIO” e a taxa de transferência associada.
Nas informações que obtive com hdmart, pude observar o seguinte:
- sata 3.0 em transporte tenho um sata versão 3 que suporta velocidade de até 6,0 Gbps; mais precisamente, corresponde a velocidades máximas de transferência de dados de até 550 MB/s. Isso tudo na teoria 🙂
- DMA…*udma6 o modo de transmissão vai até udma6 que é 133 MB/s (megabytes por segundo).
- Queue depth: 32 indica que o dispositivo suporta uma profundidade de fila de 32. Isso está relacionado à capacidade do dispositivo de processar múltiplas operações de I/O. A profundidade de fila (Queue depth) se refere ao número de comandos de I/O que um dispositivo pode lidar simultaneamente.
Uma coisa interessante é que podemos usar algumas opções para testar a transmissão do dispositivo. Por exemplo, podemos usar hdparm -tT /dev/sda para vermos dados sobre transmissão do /dev/sda
maria@ti:~$ sudo hdparm -tT /dev/sda /dev/sda: Timing cached reads: 8080 MB in 2.00 seconds = 4044.85 MB/sec Timing buffered disk reads: 660 MB in 3.01 seconds = 219.58 MB/sec
hdparm -tT /dev/sda executará um teste de leitura sequencial e fornecerá informações sobre a taxa de transferência máxima atingida durante o teste.
Execute o comando iostat -d -x,
elder@ti:~$ iostat -d -x 1 Linux 6.2.0-36-generic (ti) 27/12/2023 _x86_64_ (8 CPU) Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz f/s f_await aqu-sz %util loop0 0,00 0,00 0,00 0,00 0,14 1,21 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop1 0,00 0,00 0,00 0,00 2,16 33,68 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop10 0,00 0,01 0,00 0,00 1,50 20,40 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop11 0,00 0,01 0,00 0,00 1,50 19,75 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop12 0,00 0,01 0,00 0,00 1,28 18,91 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop13 0,00 0,01 0,00 0,00 0,63 11,60 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop14 0,00 0,00 0,00 0,00 1,71 34,43 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop15 0,00 0,00 0,00 0,00 3,62 50,97 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop16 0,00 0,01 0,00 0,00 1,28 20,59 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop17 0,00 0,00 0,00 0,00 5,41 90,37 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop18 0,00 0,16 0,00 0,00 0,47 43,11 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop19 0,00 0,00 0,00 0,00 5,69 81,82 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop2 0,00 0,00 0,00 0,00 0,96 16,17 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop3 0,00 0,00 0,00 0,00 1,55 25,58 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop4 0,00 0,00 0,00 0,00 1,45 32,57 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop5 0,00 0,00 0,00 0,00 0,92 15,66 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop6 0,00 0,01 0,00 0,00 1,55 23,94 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop7 0,00 0,00 0,00 0,00 1,92 23,65 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop8 0,00 0,00 0,00 0,00 5,89 81,84 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 loop9 0,00 0,01 0,00 0,00 1,42 21,22 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 sda 0,67 23,42 0,13 16,21 2,06 34,87 5,42 148,43 7,03 56,45 2,48 27,39 0,66 131,64 0,00 0,00 0,76 200,49 1,08 1,35 0,02 0,77 sdb 0,00 0,01 0,00 53,84 14,58 49,89 0,00 0,00 0,00 5,31 4,17 1,27 0,00 0,00 0,00 0,00 0,00 0,00 0,00 4,27 0,00 0,00 sdc 0,00 0,02 0,00 0,00 0,29 8,10 0,00 0,00 0,00 0,00 0,86 4,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00 sdd 0,02 0,20 0,01 24,97 2,85 8,09 0,01 0,97 0,01 71,69 13,60 165,89 0,00 0,00 0,00 0,00 0,00 0,00 0,00 12,82 0,00 0,01
Vamos ver o que cada opção faz:
- -d é usada para exibir estatísticas detalhadas de E/S por dispositivo.
- -x é usada para exibir estatísticas de dispositivos de armazenamento estendidas, ou seja, irá aparecer mais opções
- 1 é para atualização da tela. Podemos substituir “1” por um valor como “2”, “5”, “10”, etc., representando o intervalo em segundos entre as atualizações.
Podemos usar iostat -d /dev/sda -x 1 para exibir informações somente sobre o dispositivo /dev/sda
iostat -d /dev/sda -x 1
Entendendo o resultado trazido pelo iostat
É um pouco extenso, mais vamos listar cada opção que aparece quando executamos iostat. Esse resultado representa o desempenho do disco e a utilização do sistema. Cada métrica reflete diferentes aspectos do comportamento do sistema de E/S.
r/s
: Leituras por segundo.rkB/s
: Kilobytes lidos por segundo.rrqm/s
: Requisições de leitura mescladas por segundo.%rrqm
: Percentual de requisições de leitura mescladas em relação ao total de requisições de leitura.r_await
: Tempo médio de espera para operações de leitura.rareq-sz
: Tamanho médio de requisição de leitura.w/s
: Escritas por segundo.wkB/s
: Kilobytes escritos por segundo.wrqm/s
: Requisições de escrita mescladas por segundo.%wrqm
: Percentual de requisições de escrita mescladas em relação ao total de requisições de escrita.w_await
: Tempo médio de espera para operações de escrita.wareq-sz
: Tamanho médio de requisição de escrita.d/s
: Exclusões (deletes) por segundo.dkB/s
: Kilobytes excluídos por segundo.drqm/s
: Requisições de exclusão mescladas por segundo.%drqm
: Percentual de requisições de exclusão mescladas em relação ao total de requisições de exclusão.d_await
: Tempo médio de espera para operações de exclusão.dareq-sz
: Tamanho médio de requisição de exclusão.f/s
: Operações de falha por segundo.f_await
: Tempo médio de espera para operações de falha.aqu-sz
: Tamanho médio da fila de requisições.%util
: Percentual de utilização do dispositivo (utilização da CPU do dispositivo).
O que devo considerar para saber causa de lentidão em disco?
r/s
ew/s
(Leituras e Escritas por segundo): Se esses valores estiverem consistentemente altos, pode indicar uma carga pesada de operações de leitura e escrita.r_await
ew_await
(Tempo médio de espera para operações de leitura e escrita): Valores elevados nessas métricas podem indicar atrasos no acesso ao armazenamento.%util
(Percentual de utilização do dispositivo): Se esse valor estiver próximo de 100%, indica que o dispositivo de armazenamento está sendo amplamente utilizado e pode estar enfrentando sobrecarga.aqu-sz
(Tamanho médio da fila de requisições): Um aumento significativo neste valor pode indicar uma grande quantidade de requisições esperando para serem atendidas, o que pode contribuir para a lentidão.%rrqm
e%wrqm
(Percentual de requisições mescladas para leitura e escrita): Se esses valores forem muito baixos, pode indicar que as operações de leitura ou escrita não estão sendo otimizadas por mesclagem, o que poderia impactar o desempenho.%drqm
(Percentual de requisições mescladas para exclusão): Se o sistema estiver realizando muitas operações de exclusão não mescladas, isso pode impactar o desempenho.f/s
(Operações de falha por segundo): Um aumento significativo nessas operações pode indicar problemas de leitura ou gravação.
Outros exemplos de uso de iostat
Dica: veja mais posts sobre Linux clicando aqui.
Vamos aos exemplos práticos do uso da ferramenta iostat.
#1 Exibir estatísticas globais de E/S:
iostat
Isso mostrará estatísticas de E/S globais desde o último boot.
#2 Exibir estatísticas detalhadas de E/S por dispositivo. O comando abaixo exibirá estatísticas detalhadas por dispositivo de armazenamento.
iostat -d
#3 Exibir estatísticas de E/S por partição.
iostat -p
#4 Exibir estatísticas de E/S em intervalos regulares:
iostat -c 2
#5 Exibir estatísticas de CPU juntamente com estatísticas de E/S:
iostat -x
#6 Exibir estatísticas de E/S para dispositivos específicos:
iostat -d /dev/sdX
Substitua /dev/sdX pela partição que deseja verificar.
#7 Exibir estatísticas de E/S para todos os dispositivos:
iostat -d -k
#8 Exibir estatísticas de E/S acumuladas desde o último boot:
iostat -m