O arquivo em /proc/<pid>/io
representa 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>/io
valores 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 bash
script:
#!/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 grep
comando nas listas em wchar
vez 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)