Obtém o total de dispositivos de bloco IO do kernel, incluindo ocorrências de cache de buffer

1

Estou trabalhando na criação de uma ferramenta para exibir estatísticas do sistema no Linux. Estou usando as APIs / sys e / proc para isso para saber como elas funcionam.

Atualmente, estou lendo /sys/block/<dev>/stat para obter estatísticas de dispositivos de bloco ( docs ) . Isso funciona muito bem para ver o quanto a leitura e a gravação estão acontecendo no disco, mas estou imaginando se é possível ver a E / S total do dispositivo de bloco do ponto de vista de um aplicativo.

Veja um exemplo para demonstrar o que quero dizer:

> cat somebigfile > /dev/zero # Takes some time, triggers device I/O
> cat somebigfile > /dev/zero # Runs quickly a second time, no device I/O

Acredito que a diferença entre as duas execuções se deve ao fato de o kernel ir para o cache de buffer em vez do disco para a segunda leitura. Eu confirmei isso ao liberar o cache usando /proc/sys/vm/drop_caches , fazendo com que o comando fosse executado da mesma forma novamente.

Qual é a maneira mais fácil de ver o total de bytes lidos em dispositivos de bloco, incluindo bytes fornecidos pelo cache de buffer, durante algum período de tempo?

Eu também estou pensando em somar os valores em /proc/<pid>/io , mas isso inclui todo o I / O e não é dividido por dispositivo ou tipo.

Estou ciente de que poderia fazer isso usando algo como System Tap , mas estou me perguntando se existe uma maneira mais simples.

    
por jncraton 06.03.2018 / 21:05

1 resposta

0

Eu escrevi o serviço 'coletor de estatísticas' há vários anos - rwdisk_stat .

Eu usei valores em /sys/block/<dev>/stat e converti seus bytes.

Da perspectiva do aplicativo, cgroups é útil. É possível distinguir a aplicação em algum grupo ' blkio ' e ler 'blkio contador de .io_service_bytes.

    
por 06.03.2018 / 21:57