Saiba qual processo E / S sem iotop

12

No Linux, quero saber qual processo usa a largura de banda de E / S do meu disco.

Sei que posso usar, iotopmas tenho uma máquina em que, por várias razões, iotopnão pode ser instalada.

Como posso obter essas informações manualmente? (Como iotopse processa?)

Totor
fonte

Respostas:

16

O arquivo em /proc/<pid>/iorepresenta o que você precisa. É um pouco de trabalho de script obter uma saída semelhante a iotop. Veja a documentação do kernel do linux para os /proc/<pid>/iovalores do arquivo:

rchar

Contador de E / S: chars read O número de bytes que esta tarefa causou a leitura do armazenamento. Esta é simplesmente a soma de bytes que esse processo passou para read () e pread (). Ele inclui coisas como tty IO e não é afetado pela necessidade ou não de E / S de disco físico real (a leitura pode ter sido satisfeita no pagecache)

wchar

Contador de E / S: caracteres gravados O número de bytes que esta tarefa causou ou fará com que seja gravada no disco. Advertências semelhantes se aplicam aqui como no rchar.

[...]

read_bytes

Contador de E / S: bytes lidos Tente contar o número de bytes que esse processo realmente fez com que fossem buscados na camada de armazenamento. Feito no nível submit_bio (), é preciso para sistemas de arquivos com suporte em bloco.

write_bytes

Contador de E / S: bytes gravados Tente contar o número de bytes que esse processo causou para ser enviado à camada de armazenamento. Isso é feito na hora de sujar a página.

Agora, você pode usar esse pequeno bashscript:

#!/bin/bash

if [ "$(id -u)" -ne 0 ] ; then
  echo "Must be root" 2>&1
  exit 1
fi

delay=2
lista=$(for p in $(pgrep "."); do echo -n "$p "; grep ^rchar /proc/$p/io 2>/dev/null; done)

while :; do

  echo "-----"
  listb=$(for p in $(pgrep "."); do echo -n "$p "; grep ^rchar /proc/$p/io 2>/dev/null; done)

  echo "$lista" | while read -r pida xa bytesa; do
    [ -e "/proc/$pida" ] || continue
    echo -en "$pida:\t"
    bytesb=$(echo "$listb" | awk -v pid=$pida '$1==pid{print $3}')
    echo "$((($bytesb - $bytesa) / $delay)) b/s"
  done | sort -nk2 | tail
  sleep $delay
  listb=$lista
done

Ele cria duas listas com um atraso de 2 segundos ( $delay: pode ser aumentado ou diminuído) entre elas e, em seguida, compara as listas e calcula as diferenças. Os 10 processos com mais E / S são impressos com sua largura de banda de E / S nos últimos 2 segundos. Se você deseja gravar E / S em vez de E / S de leitura, edite o grepcomando nas listas em wcharvez de rchar:

lista=$(for p in $(pgrep "."); do echo -n "$p "; grep ^wchar /proc/$p/io 2>/dev/null; done)
listb=$(for p in $(pgrep "."); do echo -n "$p "; grep ^wchar /proc/$p/io 2>/dev/null; done)
caos
fonte