Como posso verificar quais arquivos são gravados por um aplicativo?

3

No meu sistema, sar informa uma gravação média no disco de cerca de 5MB / s. Usando dstat , descobri que não é tão permanente, mas há picos de 30 a 50MB / s e, depois, são inativos.

Usando iotop i descobri que a maior parte da escrita é feita por um aplicativo (mas não sei como isso é certo).

Usando strace e fatrace vi a abertura do aplicativo, criando arquivos em diretórios diferentes e, em seguida, fechando / removendo-os. Existem muitos arquivos, mas não vi em strace muita escrita. Eu tento descobrir mais usando /proc/pid/fd para ver se há arquivos constantemente incrementados (logs, etc), mas não consegui encontrar nenhum. Então, minha conclusão é que toda a escrita é feita com pequenos arquivos temporários criados pelo aplicativo.

Como faço para verificar quanto está escrito em cada arquivo? Eu gostaria de ter um relatório com a quantidade de bytes gravados em cada arquivo.

Existe alguma maneira de fazer isso? Pensei em reescrever syscalls como open e write para monitorar as alterações em todos os arquivos, ou usando systemtap , mas espero que haja uma maneira mais simples.

    
por undefine 23.05.2015 / 00:46

2 respostas

6

O iosnoop de Brendan Gregg (parte de seu perf-tools ) fornecerá informações detalhadas sobre o aplicativo I / O; por exemplo:

# ./iosnoop
Tracing block I/O... Ctrl-C to end.
COMM             PID    TYPE DEV      BLOCK        BYTES     LATms
supervise        1809   W    202,1    17039968     4096       1.32
supervise        1809   W    202,1    17039976     4096       1.30
tar              14794  RM   202,1    8457608      4096       7.53
tar              14794  RM   202,1    8470336      4096      14.90
tar              14794  RM   202,1    8470368      4096       0.27
tar              14794  RM   202,1    8470784      4096       7.74
tar              14794  RM   202,1    8470360      4096       0.25
tar              14794  RM   202,1    8469968      4096       0.24
tar              14794  RM   202,1    8470240      4096       0.24
[...]

(exemplo retirado da sua postagem no blog ).

Você pode usá-lo para rastrear toda a E / S do seu sistema como acima, ou limitá-lo a um único processo, dispositivo ...

    
por 23.05.2015 / 15:40
4

Você pode tentar inotify (geralmente empacotado inotify tools desde o kernel 2.6). Ele irá monitorar uma parte do seu sistema de arquivos e informá-lo sobre eventos como a criação / exclusão de arquivos ou diretórios.

Um uso simples seria:

inotifywait -m -r /tmp/

Então, quando a atividade do sistema de arquivos ocorrer, você verá:

#=> I'm creating /tmp/b
/tmp/ CREATE,ISDIR b
/tmp/ OPEN,ISDIR b
/tmp/ ACCESS,ISDIR b
/tmp/ CLOSE_NOWRITE,CLOSE,ISDIR b

man inotifywait e man inotifywatch para mais informações.

Cuidado com o uso de inotify em sistemas de arquivos largos, use muitos recursos ...

Se você combiná-lo com stat (para ver o proprietário, por exemplo) e / ou lsof (exibir todos os arquivos abertos no momento e por qual processo), talvez tenha mais dicas para saber a quem culpar.

EDITAR: Um exemplo da combinação inotify e stat :

inotifywait -m -r /tmp --format "%w%f" -e modify | while read newfile
do
  echo $newfile $(stat -c "%s" $newfile) bytes
done

Isso produzirá algo como:

/tmp/oaoa 24 bytes
/tmp/oaoa 24 bytes
/tmp/.com.google.Chrome.iLdh1J 0 bytes
/tmp/.com.google.Chrome.iLdh1J 1472 bytes
    
por 23.05.2015 / 10:10

Tags