Como encontrar os maiores arquivos abertos?

4

Procurando os maiores entre os arquivos abertos por todos os processos. lsof já tem os arquivos abertos com seus tamanhos. Pode estar passando os parâmetros corretos para lsof e processando a saída.

    
por Hakan Baba 30.07.2017 / 07:51

3 respostas

3

Você pode usar a opção -F de lsof para obter resultados quase sem ambigüidade que é máquina-analisável com apenas moderada dor . A saída é ambígua porque lsof reescreve novas linhas em nomes de arquivos para \n .

A saída lsof consiste em um campo por linha. O primeiro caractere de cada nome indica o tipo de campo e o restante da linha é o valor do campo. Os campos são: p = PID (somente para o primeiro descritor em um determinado processo), f = descritor, t = tipo ( REG para arquivos regulares, o único tipo que possui um tamanho), s = size (somente se disponível), n = name. O código awk abaixo coleta as entradas que possuem um tamanho e imprime o tamanho e o nome do arquivo. O restante dos pipelines classifica a saída e retém a entrada com o maior tamanho.

lsof -Fnst | awk '
    { field = substr($0,1,1); sub(/^./,""); }
    field == "p" { pid = $0; }
    field == "t" { if ($0 == "REG") size = 0; else next; }
    field == "s" { size = $0; }
    field == "n" && size != 0 { print size, $0; }
' | sort -k1n -u | tail -n42 | sed 's/^[0-9]* //'
    
por 31.07.2017 / 02:17
3

Você pode fazer o seguinte

lsof | grep REG | awk '{ print $1,$7,$9 }' | sort -t ' ' -k 2 -V

Usando o awk você filtra a saída para incluir o comando, tamanho e nome de arquivo e classifica-o com base na segunda coluna, que é tamanho. -t especifica o delimitador, -V classifica 'naturalmente' - assim, 1, 2, 10 serão classificados dessa maneira em vez de 1, 10, 2. - k é a chave para a classificação (a coluna pela qual você deseja classificar)

    
por 30.07.2017 / 09:07
2

Uma maneira complicada é assim:

lsof \
| grep REG \
| grep -v "stat: No such file or directory" \
| grep -v DEL \
| awk '{if ($NF=="(deleted)") {x=3;y=1} else {x=2;y=0}; {print $(NF-x) "  " $(NF-y) } }'  \
| sort -n -u  \
| numfmt  --field=1 --to=iec

Saída

...
....
129M  /var/log/maillog
166M  /var/log/nginx/access_log
172M  /var/log/metrics/kubernetes/kubelet.log
185M  /var/log/metrics/kubernetes/etcd.log
257M  /var/log/metrics/kubernetes/etcd.log.1
335M  /var/log/metrics/kubernetes/kubelet.log.1

Eu sei que isso não é perfeito. Por exemplo, se o nome do arquivo contiver "DEL", isso eliminaria esse arquivo da lista de saída. lsof também tem uma opção -F descrita na SAÍDA PARA OUTROS PROGRAMAS seção. Usar isso pode ser mais simples.

Detalhes

lsof imprime algo assim:

COMMAND      PID    TID           USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd        1                  root  cwd       DIR              253,0      4096        128 /
tuned       2975                  root    7u      REG              253,0      4096  805307770 /tmp/ffiKkVeXD (deleted)
python2    49888  49890           root  DEL       REG               0,18            196039884 /dev/shm/sem.NXPFow
systemd        1                  root  mem       REG              253,0     90664      10063 /usr/lib64/libz.so.1.2.7
java      149435 175229            box   69r      REG              253,0 350872273  808108999 /box/var/log/metrics/kubernetes/kubelet.log.1
java      149435 149580            box  107w     FIFO                0,8       0t0  272526226 pipe
prometheu 147867 148211           root  mem       REG              253,6             31457463 /lib64/ld-2.12.so (stat: No such file or directory)

grep REG mantém arquivos regulares

grep -v "stat: No such file or directory" Remova os arquivos com erro de estatística. (Eu não sei porque isso acontece)

grep -v DEL Descarta os arquivos de mapa do Linux que foram excluídos;

Em lsof documentação :

''DEL'' for a Linux map file that have been deleted;

Após esse processamento, ficamos com algo parecido com isto:

tuned       2975                  root    7u      REG              253,0      4096  805307770 /tmp/ffiKkVeXD (deleted)
systemd        1                  root  mem       REG              253,0     90664      10063 /usr/lib64/libz.so.1.2.7
java      149435 175229            box   69r      REG              253,0 350872273  808108999 /box/var/log/metrics/kubernetes/kubelet.log.1

O tamanho é a última segunda coluna, dependendo do valor da última coluna. Se a última coluna for (deleted) , escolha a 3ª do último caso contrário, 2º.

awk '{if ($NF=="(deleted)") {x=3;y=1} else {x=2;y=0}; {print $(NF-x) " " $(NF-y) } }'

sort -n -u | numfmt --field=1 --to=iec

Classifique, uniquifique e faça os bytes contarem legíveis por humanos

    
por 30.07.2017 / 08:22

Tags