Ответ 1
(Отказ от ответственности: это не прямой ответ на вопрос, просто некоторые предложения, которые, я надеюсь, будут полезны).
Во-первых, цифры, которые вы получаете, безусловно, звучат так, как будто они находятся в пределах стадиона. Обратите внимание, однако, что латентность прерываний/ловушек может сильно различаться между различными моделями ЦП, реализующими ту же самую ISA. Это также другая история, если ваши потоки использовали операции с плавающей запятой или вектором, потому что, если у них нет ядра, можно избежать сохранения/восстановления состояния с плавающей точкой или вектора.
Вы можете получать более точные цифры с помощью инфраструктуры отслеживания ядра - perf sched
, в частности, предназначен для измерения и анализа планировщика латентность.
Если ваша цель состоит в моделировании серверов нитей за соединение, то вам, вероятно, не следует измерять непроизвольную задержку переключения контекста - обычно на таком сервере большинство коммутаторов контекста будет добровольным, так как поток блокируется в read()
ожидание получения дополнительных данных из сети. Поэтому лучший тестовый стенд может включать измерение задержки с одного потока, блокирующего в read()
, на другой, который пробуждается от того же самого.
Обратите внимание, что на хорошо написанном сервере мультиплексирования при большой нагрузке переход от fd X
в fd Y
часто будет включать один и тот же системный вызов (так как сервер выполняет итерацию над списком активных файловых дескрипторов, возвращаемых из один epoll()
). Один поток также должен иметь меньший размер кеша, чем несколько потоков, просто имея только один стек. Я подозреваю, что единственный способ урегулировать этот вопрос (для некоторого определения "уладить" ) может означать повторную перестрелку...