Ini bukan jawaban untuk pertanyaan Anda. Bagaimanapun, @Klas menunjukkan bahwa
Peralihan konteks yang tidak disengaja terjadi saat utas berjalan terlalu lama
Jadi ide saya adalah Anda dapat memeriksa apakah utas Anda berjalan terlalu lama. Gunakan perf dan temukan tempat di kode Anda tempat peralihan konteks paling sering terjadi. Dan mungkin bandingkan pengukuran untuk versi lama program Anda dengan yang baru.
Perf (https://perf.wiki.kernel.org/index.php/Tutorial) memiliki acara context-switches
. Anda dapat mengukurnya dan mengumpulkan jejak tumpukan di tempat terjadinya. Ini adalah contoh pengukuran pengalih konteks:
perf record -e cs -g -p `pidof my_test` sleep 5
Dan kemudian periksa di mana itu terjadi. Misalnya, ada program di C++ dengan loop infinitif tanpa syscall sama sekali. Semua konten sakelar memiliki stracetrace dari fungsi saya 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*)
Sebaliknya, ini adalah ukuran untuk program di C++ yang memiliki loop infinitif dengan banyak syscall:
# 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
Peralihan konteks sukarela dapat terjadi setiap kali utas/proses membuat panggilan sistem yang memblokir.
Peralihan konteks yang tidak disengaja terjadi ketika utas telah berjalan terlalu lama (biasanya sekitar 10 md) tanpa melakukan panggilan sistem yang memblokir dan ada proses yang menunggu CPU.
Sepertinya program Anda sekarang lebih intensif menggunakan CPU daripada sebelumnya. Jika Anda membuatnya menjadi multi-utas maka peningkatan mungkin diharapkan.
821 sakelar konteks - bergantung pada waktu eksekusi program Anda, ini mungkin banyak atau mungkin tidak banyak.
Jika ingin mengurangi jumlah pengalih konteks, Anda dapat mengurangi jumlah thread pekerja sehingga jumlah thread lebih sedikit daripada inti CPU.
Perbarui
Dengan asumsi beban identik dalam kedua kasus, sepertinya modifikasi kode telah meningkatkan penggunaan cpu. Jika peningkatan beban menjadi perhatian, Anda harus menganalisis kode untuk menemukan kemacetan. Instrumentasi dapat membantu dalam mengisolasi bagian mana dari kode yang menyebabkan masalah.