Мое приложение содержит несколько критичных к задержке потоков, которые «крутятся», то есть никогда не блокируются. Ожидается, что такой поток займет 100% одного ядра процессора. Однако кажется, что современные операционные системы часто передают потоки от одного ядра к другому. Так, например, с этим кодом Windows:
void Processor::ConnectionThread()
{
while (work)
{
Iterate();
}
}
Я не вижу в диспетчере задач ядро "занято на 100%", общая загрузка системы 36-40%.
Но если я изменю его на это:
void Processor::ConnectionThread()
{
SetThreadAffinityMask(GetCurrentThread(), 2);
while (work)
{
Iterate();
}
}
Затем я вижу, что одно из ядер процессора занято на 100%, а также общая нагрузка на систему снижена до 34-36%.
Значит ли это, что я должен стремиться SetThreadAffinityMask
для "раскручивания" ниток? Если я улучшил задержку, добавив SetThreadAffinityMask
в этом случае? Что еще мне нужно сделать, чтобы «вращать» потоки, чтобы уменьшить задержку?
Я занимаюсь портированием своего приложения на Linux, поэтому этот вопрос больше касается Linux, если это имеет значение.
upd нашел этот слайд, который показывает, что может помочь привязка потока ожидания, занятого в ожидании, к ЦП:
nice
илиrenice
свой процесс как root (кто-то упомянул методы Windows api ниже). - person Jason   schedule 26.09.2014perf
или сrdtsc
и видите много промахов кеша или больших задержек, может иметь смысл закрепить потоки. - person Jason   schedule 28.09.2014