Risposte:
Il file in /proc/<pid>/io
rappresenta ciò di cui hai bisogno. È un po 'un lavoro di scripting per ottenere un output simile a iotop
. Vedi la documentazione del kernel linux per i /proc/<pid>/io
valori del file:
rchar
Contatore I / O: chars read Il numero di byte che questa attività ha causato la lettura dalla memoria. Questa è semplicemente la somma dei byte che questo processo ha passato a read () e pread (). Include cose come tty IO e non è influenzato dalla necessità o meno dell'IO del disco fisico effettivo (la lettura potrebbe essere stata soddisfatta da pagecache)
wchar
Contatore I / O: caratteri scritti Il numero di byte che questo task ha causato o deve causare la scrittura su disco. Avvertenze simili si applicano qui come con rchar.
[...]
read_bytes
Contatore I / O: byte letto Tentativo di contare il numero di byte che questo processo ha effettivamente causato al recupero dal livello di archiviazione. Fatto a livello submit_bio (), quindi è accurato per i filesystem supportati da blocchi.
write_bytes
Contatore I / O: byte scritti Tentativo di contare il numero di byte che questo processo ha causato all'invio al livello di archiviazione. Questo viene fatto al momento di sporcare la pagina.
Ora puoi usare quel piccolo 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
Crea due elenchi con un ritardo di 2 secondi ( $delay
: può essere inserito o ridotto) tra loro, quindi confronta gli elenchi e calcola le differenze. I 10 processi con il maggior numero di I / O vengono stampati con la loro banda I / O negli ultimi 2 secondi. Se si desidera scrivere I / O anziché leggere I / O, modificare il grep
comando negli elenchi wchar
invece di 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)