Usando dtrace para diagnosticar problemas de I/O

vie 06 de junio del 2008

Diagnosticar un problema de io siempre ha sido una tarea compleja. Las herramientas que disponen los distintos unix proporcionan datos a nivel de dispositivo o filesystem. Usando Solaris teníamos alguna ayuda extra usando truss, mdb, scat, ... sin embargo ninguna de ellas proporciona una respuesta rápida y sencilla a las preguntas que tiene un administrador de sistemas cuando se enfrenta a un problema de io

Que proceso es el que está generando el problema ?

Sobre que archivo esta escribiendo ?

Por fortuna OpenSolaris dispone de dtrace que puede proporcionarnos de forma sencilla las respuestas. Vamos a ver algunos ejemplos sencillos para diagnosticar la causa de un throughput alto de escritura.

Este comando nos lista la cantidad de bites escritos a disco por cada pid:

dtrace -n 'sysinfo:::writech { @dist[pid] = sum(arg0); }'

( Una vez identificado el pid origen del problema, el comando pfiles nos ayudará a identificar los ficheros a los que accede )

Sin embargo la carga de io puede ser debida a distintos procesos, así que quizás nos interese ver que archivos concentran el mayor número de accesos:

dtrace -n 'syscall::write:entry { @dist[fds[arg0].fi_pathname] = count(); }'

También nos puede interesar enfocar el diagnóstico de forma contraria, es decir, ver quien está accediendo a un fichero en concreto:

dtrace -q -n 'syscall::write:entry / fds[arg0].fi_pathname == "path_fichero" / { printf("Proceso %d \n", pid );}'

Como veis las posibilidades son casi infinitas, dtrace nos permite enfocar el diagnóstico desde la perspectiva que más nos interesa. Como última nota, tened en cuenta que los comandos anteriores pueden generar salidas bastante grandes en sistemas con bastante carga, así que sería aconsejable redirigirlas a un fichero y luego manipular los datos con nuestra herramienta favorita.


Posted by Roger Jordan | Categories: Opensolaris AƱadir Comentarios, Total: 0