Aula #24 - Monitoramento e Tuning do I/O




Existe uma relação forte e complicada entre I/O e desempenho do sistema. Não é fácil de entender como os processos concorrem entre si por largura de banda de I/O, utilização de CPU, uso de memória e por recursos de rede. 


Duas das principais ferramentas que podem ajudar a identificar e isolar problemas são iostat e iotop. A ferramenta ionice pode ser usada para definir prioridade de I/O entre processos.

Problemas de desempenho do disco podem estar fortemente relacionados a outros fatores, como memória insuficiente, hardware de rede inadequado, e até mesmo configuração (tuning) incorreta. Resolver este tipo de problema pode ser difícil.

Como regra geral, um sistema pode ser considerado com um gargalo de I/O quando a CPU fica a maior parte do tempo ociosa, esperando operações de I/O serem concluídas, ou quando a rede está esperando para limpar buffers.

No entanto, é fácil se enganar. O que parece ser memória insuficiente pode ser na verdade I/O muito lento; se o sistema atinge um estado em que não há mais buffers para I/O disponíveis pode parecer que a memória é o problema, quando o verdadeiro problema é que os buffers não estão enchendo ou esvaziando em velocidade suficiente. Da mesma forma, as transferências de rede podem estar aguardando que operações de I/O sejam concluídas o que causa redução na taxa de transferência da rede.

Tanto monitoramento em tempo real quanto ferramentas que fazem rastreamento são necessários para localizar e mitigar gargalos de disco. No entanto, problemas raros ou que não se repetem com frequência podem tornar a investigação muito difícil.

Há muitas variáveis ​​relevantes e ajuste (tuning) de I/O é uma tarefa complexa.





  IOSTAT



O iostat é a ferramenta básica de monitoramento de atividade de I/O. Ele pode gerar relatórios ricos em informação, com o conteúdo controlado por opções.

Apenas chamar o iostat retorna:

$ iostat
Linux 3.15.9 (q7)         09/11/2014             _x86_64_                 (4 CPU)

avg-cpu:     %user %nice %system %iowait c%stealc %idle
                            3.07     0.05         1.30         0.66         0.00 94.92


Device:                     tps    kB_read/s    kB_wrtn/s     kB_read     kB_wrtn
sda          12.10       170.52        61.69     2170494      785198
dm-0          5.58        46.32        48.74      589608      620384
dm-2          1.22         4.89         0.00       62208          12
dm-3          0.01         0.06         0.00         728           0
dm-5          0.31         1.24         0.00       15780          12
dm-6          0.05         0.20         0.00        2568          12
dm-7          0.03         0.11         0.00        1436          12
dm-8          0.03         0.13         0.00        1636          12
dm-1          0.00         0.01         0.00         152           0
dm-4          0.01         0.03         0.00         364           0
dm-10         0.01         0.03         0.00         364           0
dm-11         0.33        28.50         0.23      362769        2964
dm-13         0.03         0.10         0.00        1268          12
dm-14         0.03         0.10         0.00        1256          12
dm-15         0.01         0.03         0.00         364           0


Após um pequeno resumo do uso de CPU, estatísticas de I/O são apresentadas: tps (transações de I/O por segundo; requisições lógicas podem ser fundidas em uma requisição), blocos lidos e escritos por unidade de tempo, em que blocos são geralmente setores de 512 bytes; e o total de blocos lidos e escritos.


As informações são apresentadas por partição de disco (e também por volumes lógicos do LVM se for o caso).

Uma saída um pouco diferente é gerada ao passar o parâmetro -k, que resulta em resultados em KB ao invés de blocos:


$ iostat -k
Linux 3.15.9 (q7)             09/11/2014          _x86_64_             (4 CPU)


avg-cpu: %user %nice %system %iowait %steal  %idle
          3.07  0.05    1.29    0.66   0.00  94.93


Device:     tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda       12.07       170.00        61.53    2170494     785574
dm-0       5.57        46.18        48.61     589608     620632
dm-2       1.22         4.87         0.00      62208         12
....


Você também pode usar -m para obter resultados em MB.



Outra opção útil é is -N para mostra por nome de dispositivo (ou -d) para um formato diferente  como em:


iostat -N


Linux 3.18.0 (q7)     12/12/2014     _x86_64_    (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           4.13    0.00    7.38    1.91    0.00   86.57

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              20.26      3895.58       554.19   95397215   13571286
VG-local          4.04        18.07        45.38     442484    1111280
VG-src            0.03         0.15         0.00       3660         32
VG-dead           0.02         0.07         0.00       1692         12
VG-audio          0.01         0.05         0.00       1313         12
VG-iso_images     0.02         0.07         0.00       1812         12
VG-virtual       15.37      3718.74       481.88   91066729   11800544
VG-P              0.00         0.00         0.00         76          0
VG-pictures       0.28        27.30         0.23     668476       5700
VG-virtual2       0.01         0.05         0.00       1256         12
VG-w7back         0.00         0.01         0.00        364          0



Um relatório muito mais detalhado pode ser obtido com a opção -x (x de e'X'tendido):


$ iostat -xk


Linux 3.15.9 (q7)       09/11/2014        _x86_64_        (4 CPU)



avg-cpu: %user %nice %system %iowait %steal %idle
          3.06  0.05    1.29    0.66   0.00 94.94


Device: rrqm/s wrqm/s  r/s  w/s  rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda       1.04   2.61 7.68 4.33 169.34 61.23    38.39     0.16 12.96   10.53   17.27  1.86  2.24
dm-0      0.00   0.00 1.15 4.40  45.92 48.38    34.01     0.03  6.23    7.38    5.92  2.42  1.34



em que os campos tem o seguinte significado:




Campos estendidos do iostat




Campo        Significado
Device     Dispositivo ou nome da partição
rrqm/s     Número de requisições de leitura agrupadas por segundo, inseridas na fila do dispositivo
wrqm/s    Número de requisições de escrita agrupadas por segundo, inseridas na fila do dispositivo
r/s    Número de requisições de leitura por segundo, enviadas ao dispositivo
w/s     Número de requisições de escrita por segundo, enviadas ao dispositivo
rkB/s     KB lidos do dispositivo por segundo
wkB/s     KB escritos no dispositivo por segundo
avgrq-sz     Tamanho médio das requisições em setores de 512 bytes por segundo
avgqu-sz     Tamanho médio da fila para requisições solicitadas ao dispositivo
await     Média em milisegundos do tempo gasto entre a solicitação e a conclusão da solicitação: tempo na fila mais tempo de execução
svctm     Tempo médio de execução da solicitação em milisegundos para solicitações de I/O
%util     Percentual do tempo de CPU utilizado para executar a solicitação


Caso o percentual de utilização se aproxime de 100 o sistema pode estar saturado, ou no limite da capacidade de I/O.







IOTOP

Outra ferramenta mega útil é o iotop, que precisa ser executado como root. Ela mostra uma tabela do uso atual de I/O e atualiza a tela automaticamente como o top. Chamando sem opções:


$ sudo iotop


Total DISK READ : 132.32 M/s | Total DISK WRITE : 132.79 M/s
Actual DISK READ: 132.32 M/s | Actual DISK WRITE: 0.00 B/s
 TID PRIO USER    DISK READ   DISK WRITE   SWAPIN      IO> COMMAND
9791 be/4 root   132.32 M/s   132.79 M/s   0.00 %  72.48 % cp /usr/s~.sqfs /tmp
   1 be/4 root     0.00 B/s     0.00 B/s   0.00 %   0.00 % systemd -~rialize 22
   2 be/4 root     0.00 B/s     0.00 B/s   0.00 %   0.00 % [kthreadd]
   3 be/4 root     0.00 B/s     0.00 B/s   0.00 %   0.00 % [ksoftirqd/0]
   5 be/0 root     0.00 B/s     0.00 B/s   0.00 %   0.00 % [kworker/0:0H]
2054 be/4 coop     0.00 B/s     0.00 B/s   0.00 %   0.00 % gsd-printer
   7 be/4 root     0.00 B/s     0.00 B/s   0.00 %   0.00 % [rcu_preempt]
   8 be/4 root     0.00 B/s     0.00 B/s   0.00 %   0.00 % [rcu_sched]
   9 be/4 root     0.00 B/s     0.00 B/s   0.00 %   0.00 % [rcu_bh]
  10 rt/4 root     0.00 B/s     0.00 B/s   0.00 %   0.00 % [migration/0]
.....


Os campos be e rt sob PRIO são explicados na parte sobre ionice, mas eles significam best effort (mehlor esforço) e real time (tempo real).


Opções disponíveis podem ser exibidas com:


$ sudo iotop --help


Usage: /usr/sbin/iotop [OPTIONS]



DISK READ and DISK WRITE are the block I/O bandwidth used during the sampling
period. SWAPIN and IO are the percentages of time the thread spent respectively
while swapping in and waiting on I/O more generally. PRIO is the I/O priority at

which the thread is running (set using the ionice command).


Controls: left and right arrows to change the sorting column, r to invert the
sorting order, o to toggle the --only option, p to toggle the --processes
option, a to toggle the --accumulated option, i to change I/O priority, q to
quit, any other key to force a refresh.


Options:
--version            show program's version number and exit
-h, --help           show this help message and exit
-o, --only           only show processes or threads actually doing I/O
-b, --batch          non-interactive mode
-n NUM, --iter=NUM   number of iterations before ending [infinite]
-d SEC, --delay=SEC  delay between iterations [1 second]
-p PID, --pid=PID    processes/threads to monitor [all]
-u USER, --user=USER users to monitor [all]
-P, --processes      only show processes, not all threads
-a, --accumulated    show accumulated I/O instead of bandwidth
-k, --kilobytes      use kilobytes instead of a human friendly unit
-t, --time           add a timestamp on each line (implies --batch)
-q, --quiet          suppress some lines of header (implies --batch)



Usar a opção -o pode ser útil para evitar excesso de informação apresentada.





IONICE

O aplicativo ionice exibe tanto a classe de scheduling de I/O quanto a prioridade de um processo especificado. A linha de comando:


$ ionice [-c classe] [-n prioridade] [-p pid ] [COMANDO [ARGUMENTOS] ]



Se um pid é fornecido através da opção -p o processo com aquele pid será monitorado, caso contrário o COMANDO será executado com ARGUMENTOS se necessário. Chamar o ionice sem argumentos mostra a classe de scheduling de I/O e a prioridade do processo atual do shell em execução. Veja um exemplo:



$ ionice

idle: prio 7


O parâmetro -c especifica a classe de scheduling de I/O, que pode assumir um dos três valores:




 Classes de Scheduling de I/O




Classe de Scheduling de I/O    valor do -c     Significado

Idle(Livre)    1     Sem acesso a I/O de disco a não ser que nenhum programa tenha solicitado I/O de disco por um período definido.
Best effort(Melhor esforço)     2     Todos os programas são servidos respeitando o algorítimo round robin que agenda solicitações de acordo com prioridades. É a opção padrão.
Real Time(Tempo Real)     3     Acessa o disco primeiro, pode prejudicar outros processos. A prioridade define o tamanho da fatia de tempo que cada processo recebe.



As classes Best Effort e Real Time recebem o argumento -n que define a prioridade, que pode variar de 0 a 7 com 0 sendo a prioridade mais alta.  Por exemplo:


$ ionice -c 2 -n 3 -p 30078


Nota: O ionice só funciona em conjunto com o scheduler de disco CFQ que veremos em breve.


Mais vistos no mês:

As melhores distribuições Linux para 2017

Teste de Performance de Rede com Iperf

TuxMath - Tux, do Comando da Matemática. Ensino e diversão a crianças.

Aula #14 - Os sistemas de arquivos ext2/ext3/ext4

Modelo Firewall Completo em Iptables para pequena rede/office

DHCP - Guia Completo

OPNsense - Firewall Open Source

SSD no linux

Administração de sistema e Deploys: Ansible, Chef, Fabric, Puppet ou Salt?