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?)

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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.