GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué significa cambios de contexto involuntarios altos?

Esto no es una respuesta a su pregunta exactamente. De todos modos, @Klas señala que

Se produce un cambio de contexto involuntario cuando un subproceso se ha estado ejecutando durante demasiado tiempo

Así que mi idea es que puedas comprobar qué hilos duran demasiado. Use perf y encuentre lugares en su código donde los cambios de contexto ocurren con mayor frecuencia. Y posiblemente compare las medidas de la versión anterior de su programa con la nueva.

Perf (https://perf.wiki.kernel.org/index.php/Tutorial) tiene el evento context-switches . Puede medirlo y recopilar stacktraces donde sucede. Este es un ejemplo de medición de cambios de contexto:

perf record -e cs -g -p `pidof my_test` sleep 5

Y luego verifique dónde suceden. Por ejemplo, hay un programa en C++ con un ciclo infinitivo sin llamadas al sistema en absoluto. Todos los contenidos del interruptor tienen seguimiento de mi función my_thread_func :

perf report --stdio -g --kallsym=/boot/System.map-2.6.32-431.el6.x86_64

# Samples: 7  of event 'cs'
# Event count (approx.): 7
#
# Overhead  Command      Shared Object                         Symbol
# ........  .......  .................  .............................
#
   100.00%  my_test  [kernel.kallsyms]  [k] perf_event_task_sched_out
            |
            --- perf_event_task_sched_out
                schedule
                retint_careful
                my_thread_func(void*)

Por el contrario, esta es una medida para un programa en C++ que tiene un bucle infinito con muchas llamadas al sistema:

# Samples: 6  of event 'cs'
# Event count (approx.): 6
#
# Overhead          Command      Shared Object                         Symbol
# ........  ...............  .................  .............................
#
   100.00%  my_test_syscall  [kernel.kallsyms]  [k] perf_event_task_sched_out
            |
            --- perf_event_task_sched_out
                schedule
               |
               |--83.33%-- sysret_careful
               |          syscall
               |
                --16.67%-- retint_careful
                          syscall

Un cambio de contexto voluntario puede ocurrir cada vez que un hilo/proceso realiza una llamada al sistema que bloquea.

Un cambio de contexto involuntario ocurre cuando un subproceso se ha estado ejecutando durante demasiado tiempo (normalmente unos 10 ms) sin realizar una llamada al sistema que se bloquea y hay procesos esperando por la CPU.

Parece que su programa consume más CPU ahora que antes. Si lo ha hecho con subprocesos múltiples, es probable que se espere un aumento.

821 cambios de contexto:dependiendo del tiempo de ejecución de su programa, esto puede o no ser mucho.

Si desea reducir la cantidad de cambios de contexto, puede reducir la cantidad de subprocesos de trabajo para que haya menos subprocesos que núcleos de CPU.

Actualizar

Suponiendo que la carga sea idéntica en ambos casos, parece que las modificaciones del código han aumentado el uso de la CPU. Si le preocupa el aumento de la carga, debe analizar el código para encontrar el cuello de botella. La instrumentación puede ser útil para aislar qué parte del código está causando el problema.


Linux
  1. ¿Qué significa - en este comando de Linux?

  2. ¿Qué significa set -e en un script bash?

  3. ¿Qué pasa si [[ $? -ne 0 ]]; significa en .ksh

  4. ¿Qué significa -zxvf en tar -zxvf <nombre de archivo>?

  5. ¿Qué significa la capacidad ep?

¿Qué significa chmod 777?

¿Qué significa "-" (doble guión)?

¿Qué significa ser "sh compatible"?

¿Qué significa en la salida de Ps?

¿Qué significa `chown Root.root $file`?

No hay variable X11 DISPLAY - ¿qué significa?