El archivo en /proc/<pid>/io
representa 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>/io
valores 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 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 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 grep
comando en las listas en wchar
lugar 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)