Investigue las escrituras en disco para saber qué proceso escribe en mi SSD

11

Intento minimizar las escrituras en disco en mi nueva unidad de sistema SSD. Estoy atascado con la salida de iostat:

~ > iostat -d 10 /dev/sdb
Linux 2.6.32-44-generic (Pluto)     13.11.2012  _i686_  (2 CPU)

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               8,60       212,67       119,45   21010156   11800488

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               3,00         0,00        40,00          0        400

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               1,70         0,00        18,40          0        184

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               1,20         0,00        28,80          0        288

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               2,20         0,00        32,80          0        328

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               1,20         0,00        23,20          0        232

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               3,40        19,20        42,40        192        424

Como veo hay escrituras en sdb. ¿Cómo puedo resolver qué proceso escribe?

Sé sobre iotop , pero no muestra a qué sistema de archivos se está accediendo.

zuba
fuente

Respuestas:

7

Lo siguiente utiliza el mecanismo de volcado de bloque de memoria virtual del núcleo. Primero obtenga el script perl:

wget https://raw.githubusercontent.com/true/aspersa-mirror/master/iodump

Luego encienda el volcado de bloques:

echo 1 | sudo tee /proc/sys/vm/block_dump

Y ejecuta lo siguiente:

while true; do sleep 1; sudo dmesg -c; done  | perl iodump

..y presione Controlcpara finalizar, verá algo como lo siguiente:

^C# Caught SIGINT.
TASK                   PID      TOTAL       READ      WRITE      DIRTY DEVICES
jbd2/sda3-8            620         40          0         40          0 sda3
jbd2/sda1-8            323         21          0         21          0 sda1
#1                    4746         11          0         11          0 sda3
flush-8:0             2759          7          0          7          0 sda1, sda3
command-not-fou       9703          4          4          0          0 sda1
mpegaudioparse8       8167          2          2          0          0 sda3
bash                  9704          1          1          0          0 sda1
bash                  9489          1          0          1          0 sda3
mount.ecryptfs_       9698          1          1          0          0 sda1

Y apague el volcado de bloques cuando haya terminado:

echo 0 | sudo tee /proc/sys/vm/block_dump

Gracias a http://www.xaprb.com/blog/2009/08/23/how-to-find-per-process-io-statistics-on-linux/ por esta útil información.

Colin Ian King
fuente
10

Al menos podrías comenzar con iotop. No le dirá qué sistema de archivos se está escribiendo, pero le dará algunos procesos para investigar.

sudo apt-get install iotop
sudo iotop

Muestra lecturas y escrituras instantáneas del disco y el nombre del comando de lectura o escritura.

Si está tratando de detectar un proceso que escribe con poca frecuencia, puede usar la --accumulateopción o registrar la salida en un archivo:

sudo -i
iotop --batch > iotop_log_file

Obviamente, la escritura del archivo de registro se mostrará en los resultados, pero también debería poder buscar otros procesos que escriban en el disco.

En este punto, debería poder encontrar algunos procesos sospechosos candidatos. La columna izquierda en iotop muestra el pid. A continuación, descubra a qué descriptor de archivo está escribiendo el proceso:

sudo -i
strace -p <pid> 2>&1 | grep write

Debería ver una salida como esta cuando el proceso escribe:

write(1, "\n", 1)                       = 1
write(4, "test\n", 5)                   = 5
write(1, ">>> ", 4)                     = 4

El primer argumento para escribir es el descriptor de archivo. Probablemente estamos buscando valores mayores que 2, porque 0, 1 y 2 son simplemente stdin, stdout y stderr. El descriptor de archivo 4 parece interesante.

Ahora puede averiguar a qué archivo apunta el descriptor de archivo:

lsof -p <pid>

Lo que debería producir resultados como:

...
python  23908  rob  mem    REG    8,1    26258 8392656 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
python  23908  rob    0u   CHR  136,5      0t0       8 /dev/pts/5
python  23908  rob    1u   CHR  136,5      0t0       8 /dev/pts/5
python  23908  rob    2u   CHR  136,5      0t0       8 /dev/pts/5
python  23908  rob    3w   REG   0,25      909 9049082 /home/rob/testfile
python  23908  rob    4w   REG   0,25       20 9049087 /home/rob/another_test_file

Mira la cuarta columna. 4wsignifica que el descriptor de archivo 4 está abierto para escritura y el archivo lo está another_test_file.

Es posible que un proceso abra, escriba y luego cierre un archivo, en cuyo caso lsof no lo mostraría. Puede ver que esto suceda con:

strace -p <pid> 2>&1 | grep open
Rob Fisher
fuente
No sabía sobre --acumulte ¡ Esa es una característica realmente genial! ¡¡¡Muchas gracias por eso!!! iotop: la redirección de salida de lote falla con UnicodeEncodeError: el códec 'ascii' no puede codificar caracteres en la posición 92-99: el ordinal no está en el rango (128) en el archivo "/usr/lib/pymodules/python2.6/iotop/ui. py ", línea 405, en refresh_display
zuba
Me alegro de que mi respuesta fue de alguna utilidad al menos. La redirección funciona para mí; No estoy seguro de poder explicar eso.
Rob Fisher el
Ok, jugué un poco y descubrí que podía usar lsof y strace para al menos hacer suficiente trabajo de detective para detectar procesos que escriben en un SSD. Esperemos que esto finalmente responda la pregunta tal como se hizo, ¡aunque parece que la respuesta de Colin Ian King es más fácil!
Rob Fisher
1
Perdón por la respuesta tardía, no tuve nada que decir hasta que jugué con strace. Gracias por ese otro enfoque inteligente, voté. Me resultó bastante difícil escribir un script para implementarlo, debido a la poca experiencia en escribir scripts de shell. Por eso he elegido otra solución. ¡Gracias por compartir tu conocimiento!
zuba
Debería serlo --accumulated, pero el intercambio de pila requiere 6 caracteres para aceptar la edición de la publicación.
h__