Estoy canalizando la salida de un programa a algún Perl que escribí. Este es un proceso de larga duración, a veces días, por lo que quiero saber dónde están mis cuellos de botella e intentar abrirlos. Quiero saber si los datos se están canalizando a mi script más rápido de lo que mi script puede procesarlo. Si este es el caso, intentaré afinar mi script, pero no si no lo necesito. Veo hablar de que se establece un indicador cuando el búfer está lleno, lo que impide que se escriban más, pero ¿cómo puedo verificar si o con qué frecuencia se establece ese indicador? ¿Algunas ideas?
11
pv
algún lugar a lo largo de la cadena de tuberías.Respuestas:
Rastrearía su script Perl con una herramienta de rastreo de llamadas del sistema:
strace
(Linux),dtruss
(OS X),ktrace
(FreeBSD),truss
(Solaris), etc. El objetivo sería ver cuánto tiempo pasa su script Perl esperando a leer de su stdin y cuánto tiempo pasa el otro programa esperando a escribir en su stdout.Aquí estoy probando esto con el escritor como el cuello de botella:
El primer número aquí es el tiempo desde el inicio de la llamada al sistema anterior, y el último número es el tiempo que pasó en la llamada al sistema. Entonces podemos postprocesar con Perl un poco para agregarlo ... [*]
Podría volverse más elegante y crear un script SystemTap o DTrace que rastrea ambos lados a la vez, solo rastrea el descriptor de archivo correcto e imprime una actualización de estado agradable cada segundo más o menos con qué porcentaje de tiempo cada uno estaba esperando al otro.
[*] - Advertencia: mi agregación cruda no es del todo correcta si se llama a lectura / escritura en otros descriptores de archivo; subestimará el tiempo de trabajo en ese caso.
La versión dtrace es bastante bonita en realidad.
Y la versión de SystemTap:
fuente
Puede insertar un
pv -TC
comando en su tubería:pv
usa su propio búfer y-T
le informa que está lleno en promedio en períodos de 1 segundo (por defecto).Si siempre es 100%, entonces eso significa que
cmd1
es más rápido en producir resultados quecmd2
en consumirlos. Si no, entonces es al revés. Tenga en cuenta que las tuberías pueden contener 64kB.Consulte también
-B
para especificarpv
el tamaño del búfer. Puede usar variospv
s como en:fuente