Sepa qué proceso realiza E / S sin iotop

12

En Linux, quiero saber qué proceso usa el ancho de banda de E / S de mi disco.

Sé que puedo usar iotoppero tengo una máquina donde, por varias razones, iotopno se puede instalar.

¿Cómo puedo obtener esa información manualmente? (¿Cómo se hace iotop?)

Totor
fuente

Respuestas:

15

El archivo en /proc/<pid>/iorepresenta lo que necesita. Es un trabajo de secuencia de comandos un poco para obtener una salida similar a iotop. Consulte la documentación del kernel de Linux para ver los /proc/<pid>/iovalores del archivo:

rchar

Contador de E / S: caracteres leídos El número de bytes que esta tarea ha provocado que se lean del almacenamiento. Esto es simplemente la suma de bytes que este proceso pasó a read () y pread (). Incluye cosas como tty IO y no se ve afectado por si se requirió o no un disco físico real (la lectura podría haberse satisfecho desde el caché de página)

wchar

Contador de E / S: caracteres escritos El número de bytes que esta tarea ha causado o causará que se escriban en el disco. Advertencias similares se aplican aquí como con rchar.

[...]

leer_bytes

Contador de E / S: lectura de bytes Intente contar la cantidad de bytes que este proceso realmente provocó que se obtuviera de la capa de almacenamiento. Hecho en el nivel submit_bio (), por lo que es preciso para sistemas de archivos respaldados por bloques.

escritura_bytes

Contador de E / S: bytes escritos Intente contar el número de bytes que este proceso provocó que se enviaran a la capa de almacenamiento. Esto se hace en el momento de ensuciar la página

Ahora, puedes usar ese pequeño 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 dos listas con un retraso de 2 segundos ( $delay: puede ser incluido o disminuido) entre ellas, y luego compara las listas y calcula las diferencias. Los 10 procesos con más E / S se imprimen con su ancho de banda de E / S en los últimos 2 segundos. Si desea escribir E / S en lugar de leer E / S, simplemente edite el grepcomando en las listas en wcharlugar 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
fuente