Como obtenho um total de dados escritos por processo e por arquivo em um sistema linux?

1

Eu preciso coletar alguns dados sobre o quanto cada processo no meu sistema grava em um determinado disco. Estou interessado apenas em um total geral depois de dizer uma semana. Eu também preciso de algo semelhante para arquivos. Ou seja Eu gostaria de saber o top 10 dos arquivos que têm mais dados escritos em uma semana e exatamente quanto foi escrito para cada um.

Para ilustrar, o resultado final deve ser duas tabelas / arquivos de texto / qualquer formato de arquivo gerenciável que tenha dados como este:

Por processo:

Process          Total amount of data written to /dev/sda by that process in a week
--------         ----------
logdaemon        101 GB
gvfsd-sftp --spawner :1.19 /org/gtk/gvfs/exec_spaw/2 [pool]   30 GB
openoffice       50 GB
[jbd2/dm-0-2]     2 GB
...

Por arquivo:

File                                             Total amount written to that file last week
--------                                         --------
/var/log/some_giant_logfile.log                  100 GB
/home/confus/Videos/great_big_video.mpg           16 GB
...

Como posso conseguir isso?

    
por con-f-use 20.12.2017 / 10:28

2 respostas

1

Você pode escrever um script bash para fazer isso ... e configurá-lo no crontab para executar semanalmente e gravar sua saída em um arquivo

* identifique quanto um processo específico gravou em um arquivo assim:

#get its pid
PID='ps -ef | awk '/<process_name>/ {print $2}''
#print out size and filename
lsof -p ${PID} | awk '/<file_you_want>/ {print $7"\t"$NF}' | sort -u
#find out device on which above file is located
df /path/to/file_you_want | awk '/\/dev/ {print $0}'

* calcule quanto foi escrito em uma semana para um arquivo da seguinte forma:

#issue the below command and save the output to a file
NEW='du /path/to/file_you_want | tee -a  /path/to/store_value.txt'
#read the output one week later
OLD_VAL='grep '/path/to/file_you_want' /path/to/store_value.txt | awk '{print $1}''
#overwrite new value and store it in memory
NEW='du /path/to/file_you_wan | tee -a  /path/to/store_value.txt'
NEW_VAL='echo $NEW | awk '{print $1}''
#calculate delta
DELTA='echo "${NEW_VAL}-${OLD_VAL}" | bc
# print the amount of bytes that have been written in 1 week
echo $DELTA
    
por 20.12.2017 / 15:49
1

Estou respondendo apenas parcialmente sua primeira sentença aqui, quantidade de dados gravados por processo, vinculando esses E / S aos quais o disco precisará mais trabalho para correlacionar as informações de E / S de E / S do disco (e provavelmente será interrompido em altos volumes de E / S ).

Uma opção para essa informação é usar netdata que grava disco e grava por aplicativo.

Você pode armazená-lo em um banco de dados timeseries como infuxDB (netdata pode fazer isso nativamente) e depois obter os valores por aplicativo agregados com grafana ou qualquer outra ferramenta qury, ou se inspirar no plugin do aplicativo source code para obter os valores processando o sistema de arquivos / proc para obter as informações necessárias.
Um exemplo de como obter informações (swap) para todos os processos é aqui (eu faço o link para minha própria resposta, pois não faz isso) t loop em find result e é uma melhoria real na velocidade)

Outra opção pode ser para entrar no daemon de auditoria no linux para ver se aureport pode fornecer as informações que você procura. Eu nunca configurei o auditd para este propósito, há um monte de tutorial sobre isso no google cobrindo vários aspectos, mas este em particular parece que você vai precisar cavar nas man pages e testar muito.

    
por 20.12.2017 / 16:05