Tiempo récord de cada cambio de contexto de proceso o subproceso

Tiempo récord de cada cambio de contexto de proceso o subproceso

Estoy tratando de lograr el procesamiento más cercano posible al tiempo real con una distribución Raspbian en una Raspberry Pi para manipular sus pines GPIO. Quiero tener una "sensación" del tipo de actuación que puedo esperar.

Iba a hacer esto escribiendo un programa C simple que alterna un pin repetidamente lo más rápido posible y monitoreándolo con un analizador lógico.

Pero tal vez haya otra manera, escribiendo el programa anterior pero simplemente registrando cambios de contexto para ver exactamente cuándo ese hilo/proceso tiene control durante un período de muestra de, digamos, un par de segundos.

Esta pregunta anteriorresponde cómo ver cuántos cambios de contexto se realizan en un período de tiempo para un proceso determinado, pero ¿hay alguna manera de registrar el momento preciso de los cambios, y tal vez para cada proceso, no solo uno? Obviamente, esto generaría gastos generales, pero aún así podría resultar útil. Obviamente, los datos deben almacenarse en la RAM para minimizar la sobrecarga.

Nota personal: posibles soluciones:

  • Comando para listar en tiempo real todas las acciones de un proceso
  • Hacky: haga que el programa obtenga y almacene repetidamente la hora actual (y guárdela en un archivo una vez que el registro alcance un cierto límite). O una ligera mejora para evitar registros enormes: utilice un algoritmo que elimine los tiempos consecutivos si están lo suficientemente cerca entre sí como para poder deducir que no fueron reemplazados por ningún otro proceso.

Respuesta1

No tengo una respuesta pero es posible que encuentres una entre lasherramientas, ejemplos y recursosescrito o enumerado por Brendan Gregg en el perfcomando y ftrace y debugfs del kernel de Linux.

En mi Raspberry Pi, estas herramientas estaban en un paquete perf-tools-unstable. En realidad, el perfcomando estaba en /usr/bin/perf_3.16.


De interés puede ser estodiscusióny cambio de contextopunto de referenciapor Benoît Sigoure y ellat_ctxprueba de lo bastante viejobanco de trabajosuite.

Es posible que necesiten algo de trabajo para ejecutarse en Pi, por ejemplo, tsuna/contextswitchedité timectxswws.c get_iterations()en while (iterations * ws_pages * 4096UL < 4294967295UL) {y eliminé -march=native -mno-avxdel archivo Makefile.


Usando perf recorddurante 10 segundos en el Pi a través de ssh mientras lo hace simultáneamente while sleep .1;do echo hi;doneen otro ssh:

sudo timeout -10 perf_3.16 record -e context-switches -a
sudo perf_3.16 script -f time,pid,comm | less

da una salida como esta

           sleep 29341 2703976.560357: 
         swapper     0 2703976.562160: 
    kworker/u8:2 29163 2703976.564901: 
         swapper     0 2703976.565737: 
            echo 29342 2703976.565768: 
     migration/3    19 2703976.567549: 
           sleep 29343 2703976.570212: 
     kworker/0:0 28906 2703976.588613: 
     rcu_preempt     7 2703976.609261: 
           sleep 29343 2703976.670674: 
            bash 29066 2703976.671654: 
            echo 29344 2703976.675065: 
            sshd 29065 2703976.675454: 
         swapper     0 2703976.677757: 

presumiblemente mostrando cuándo ocurrió un evento de cambio de contexto, para qué proceso.

información relacionada