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.