Questa non è una risposta esattamente alla tua domanda. Ad ogni modo, @Klas lo sottolinea
Un cambio di contesto involontario si verifica quando un thread è in esecuzione da troppo tempo
Quindi la mia idea è che puoi controllare quali thread sono troppo lunghi. Usa perf e trova i punti nel tuo codice in cui i cambi di contesto si verificano più spesso. E possibilmente confronta le misure per la vecchia versione del tuo programma con quella nuova.
Perf (https://perf.wiki.kernel.org/index.php/Tutorial) ha l'evento context-switches
. Puoi misurarlo e raccogliere stacktrace dove accade. Questo è un esempio di misurazione dei cambi di contesto:
perf record -e cs -g -p `pidof my_test` sleep 5
E poi controlla dove accadono. Ad esempio, esiste un programma in C++ con un ciclo infinito senza alcuna chiamata di sistema. Tutti i contenuti di switch hanno stracetrace dalla mia funzione 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*)
Al contrario, questa è una misura per un programma in C++ che ha un ciclo infinito con molte chiamate di 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 di contesto volontario può verificarsi ogni volta che un thread/processo effettua una chiamata di sistema che blocca.
Un cambio di contesto involontario si verifica quando un thread è stato eseguito troppo a lungo (di solito qualcosa come 10 ms) senza effettuare una chiamata di sistema che si blocca e ci sono processi in attesa della CPU.
Sembra che il tuo programma sia più intensivo per la CPU ora rispetto a prima. Se lo hai reso multi-thread, è probabile che ci si aspetti un aumento.
821 cambi di contesto - a seconda del tempo di esecuzione del tuo programma questo può essere o non essere molto.
Se vuoi ridurre il numero di cambi di contesto, puoi ridurre il numero di thread di lavoro in modo che ci siano meno thread rispetto ai core della CPU.
Aggiorna
Supponendo che il carico sia identico in entrambi i casi, sembra che le modifiche al codice abbiano aumentato l'utilizzo della CPU. Se l'aumento del carico è un problema, dovresti analizzare il codice per trovare il collo di bottiglia. La strumentazione può essere utile per isolare quale parte del codice sta causando il problema.