Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

252
Visualizações
¿Cómo medir la latencia de la migración de subprocesos lejos de un núcleo ocupado por el programador de Linux?

Tengo la tarea de medir el tiempo de migración de un hilo en Linux, en programas escritos en C o C++.

Estoy ejecutando un solo subproceso en un núcleo inactivo (sin afinidad), luego, para obligar al programador a equilibrar la carga y migrar el subproceso, fijo un segundo subproceso en el mismo núcleo. Sabemos que tan pronto como se crea un nuevo subproceso/proceso, el planificador equilibra los subprocesos, lo que hace que el primer subproceso migre de ese núcleo al menos ocupado (porque el segundo subproceso está anclado a ese núcleo).

Me gustaría medir este tiempo de migración de subprocesos con un temporizador de alta resolución. Intenté perf sched pero solo realiza un seguimiento de los eventos de migración. Para aclarar, por latencia me refiero a la diferencia entre el momento en que se crea el segundo subproceso en el núcleo y el momento en que el primer subproceso se migra por completo a un nuevo núcleo.

¿Cómo puedo medir esta latencia?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Kernelshark es tu amigo para esta tarea. Eche un vistazo a The Graph Window , y especialmente a Task Plots (aproximadamente a la mitad). Debe tener las opciones correctas compiladas en su kernel (FTRACE para empezar), y se requiere cierta precisión para controlar la captura de datos para que abarque el evento que desea, pero luego puede obtener detalles muy finos de lo que está pasando en toda la máquina.

Básicamente, puede ver el destino completo de cada subproceso en el sistema, en qué CPU se estaba ejecutando, cuándo, por qué, etc. Hay lo que parece ser un tutorial útil aquí .

Este tipo de herramienta es genial para ver exactamente lo que sucede en un sistema. También aparecen otras cosas, como los interruptores de modo de energía de la velocidad del reloj de la CPU (todo puede detener el stock sin razón aparente), etc.

over 4 years ago · Santiago Trujillo Relatório

0

Si está utilizando una CPU x86 moderna, la instrucción rdtscp probablemente sea útil para obtener una marca de tiempo precisa en nanosegundos y una ID de núcleo como una única instrucción asm, por lo que ambas provienen del mismo núcleo. Linux establece el MSR IA32_TSC_AUX como un entero pequeño que coincide con la numeración central que utiliza para la afinidad, por ejemplo, si se ejecuta bajo taskset -c 3 ./a.out , obtiene un ID = 3 del siguiente programa de prueba:

 #include <x86intrin.h> #include <stdio.h> int main(){ unsigned id; unsigned long tsc = __rdtscp(&id); printf("tsc = %ld ID = %d\n", tsc, id); }

Consulte también ¿Cómo obtener el recuento de ciclos de la CPU en x86_64 desde C++? para obtener más detalles sobre el TSC en general y el hecho de que la mayoría de los sistemas x86 modernos tienen TSC sincronizados entre núcleos. (Especialmente en CPU de múltiples núcleos de un solo zócalo, pero las placas base de múltiples zócalos bien diseñadas también pueden hacerlo). Además, el TSC se ejecuta a una frecuencia de referencia fija, no a ciclos de reloj centrales, por lo que es un proxy para el tiempo de reloj de pared. .

Por lo tanto, podemos recopilar un ID de núcleo con una marca de tiempo como parte de una sola instrucción de asm , lo que significa que ambos provienen definitivamente del mismo núcleo. (Una interrupción no puede aparecer en medio de una sola instrucción). Esto descarta algunos tipos de problemas.

Puede escribir un ciclo que gire en __rdtscp hasta que vea el cambio de ID del núcleo, luego registre o imprima el último valor de TSC del núcleo anterior y el primer valor de TSC del nuevo núcleo. (Y el delta, pero desea que el valor absoluto de TSC se compare con un TSC antes de iniciar un nuevo subproceso o establecer la afinidad del subproceso).

 uint64_t spin_until_migration(some output args) { unsigned old_id, new_id; uint64_t old_tsc; uint64_t new_tsc = __rdtscp(&old_id); do { old_tsc = new_tsc; new_tsc = __rdtscp(&new_id); }while(old_id != new_id); // *arg1 = old_tsc; // ... return new_tsc - old_tsc; }

(Mientras gira en el mismo núcleo, los deltas normalmente serán de alrededor de 32 ciclos de reloj de núcleo en Skylake, por ejemplo ( https://uops.info/ ). Si la frecuencia actual de la CPU está cerca de su frecuencia de referencia TSC (a menudo cerca de su "nominal") " frecuencia de etiqueta, por ejemplo, 4008 MHz en mi i7-6700k 4.0GHz con turbo de 4.2GHz), eso también es aproximadamente 32 ciclos de núcleo. Se producirán deltas más grandes para los controladores de interrupciones u otras cosas que detienen temporalmente la ejecución del espacio de usuario).

Tenga en cuenta que este código solo mide la última vez que este subproceso obtuvo un intervalo de tiempo en el núcleo anterior. La decisión del programador de migrar el subproceso puede llegar más tarde, después de que el subproceso anclado ya se haya estado ejecutando durante algún tiempo en este núcleo.

Querrá registrar las marcas de tiempo de TSC en varios pasos de su carga de competencia, como antes de comenzar un nuevo hilo y después. O antes/después de realizar una llamada al sistema de afinidad de CPU que migra un subproceso existente. No he pensado en todos los detalles.

over 4 years ago · Santiago Trujillo Relatório

0

¿Podría usar un contador de rendimiento de hardware? No dijiste exactamente cuál era tu CPU y, sinceramente, no pude ayudarte mucho con los detalles, pero la mayoría de las CPU tienen un contador de ciclos en alguna parte. Escribiría código en sus subprocesos para almacenar en caché el valor del contador y luego puede imprimirlo para obtener la precisión del ciclo del tiempo entre dos eventos. Obviamente no puedes imprimirlo de inmediato o afectará el tiempo.

https://en.wikipedia.org/wiki/Hardware_performance_counter

¿Cómo obtener el recuento de ciclos de CPU en x86_64 desde C++?

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda