Scopri quale processo esegue I / O senza iotop


12

Su Linux, voglio sapere quale processo utilizza la mia larghezza di banda I / O del disco.

So che posso usare iotopma ho una macchina in cui, per vari motivi, iotopnon può essere installata.

Come posso ottenere manualmente tali informazioni? (Come iotopsi procede?)

Risposte:


15

Il file in /proc/<pid>/iorappresenta 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>/iovalori 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 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

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 grepcomando negli elenchi wcharinvece 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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.