В linux самый надежный способ идентификации переключения контекста, который я нашел, - это команда:
pidstat -hluwrt | grep "processname"
Столбец 'tid' (# 3) аналогичен столбцу 'gettid ()', что позволяет разработчику напрямую сопоставлять, какой поток использует ЦП и переключение контекста. Я предлагаю, чтобы при создании потока для программы выплевывалось значение gettid (): printf ("% lul", gettid ()) .
Последние 2 столбца, предшествующие командной строке процесса, - это число переключений контекста 'cswtch / s' (добровольное) и 'nvcswtch / s' (недобровольное) в секунду.
Когда значение «cswtch / s» высокое (1000), ваш процесс чрезмерно циклически повторяет «пробуждение» и «сон». Возможно, вы захотите использовать какой-нибудь буфер для потоков, что позволит увеличить время пробуждения и сна. пример: когда буфер НЕ заполнен, поток дольше остается в спящем режиме. Когда буфер заполняется, поток не активен, пока буфер не станет пустым.
Когда значение nvswtch / s высокое (1000), это признак того, что ваша система сильно загружена, и отдельный поток конкурирует за процессорное время. Возможно, вы захотите выяснить нагрузку на сервер, количество активных процессов и потоков на сервере: «top» или «htop» - ваши друзья.
Я считаю следующий скрипт полезным для отладки / оптимизации потоков процессов (выводится каждые 20 секунд):
stdbuf -oL pidstat -hluwrt 20 | stdbuf -oL grep -e "processname" -e "^#"
Документация для gettid: (документ здесь)
Документация для пидстата: (документ здесь)
Документация для stdbuf: (документ здесь)