Как потоки распределяются между ядрами в многопроцессорной системе?
В настоящее время я проверяю ограничения серверного приложения в системе с двумя 12-ядерными процессорами, то есть с 24 ядрами. (Гиперпоточность в настоящее время отключена).
Я запускаю 12 экземпляров того же приложения с высокой нагрузкой по протоколу UDP на этом боксе, и, по словам диспетчера задач, он максимально использует все 12 ядер одного из двух сокетов. Но другой сокет простаивает. Я также попытался запустить 13-й экземпляр этого приложения, но он все еще запускается на первом, уже занятом сокете.
Зачем? Каковы правила, по которым потоки распределяются по ядрам в многопроцессорной системе?
Некоторые идеи:
- Может ли это быть связано с RSS (масштабирование на стороне приема), который включен и будет участвовать в выборе ядер, по крайней мере, для потока получателя нашего приложения (но у приложения есть и другие трудоемкие потоки)?
- RSS (или MSI/MSI-X) ограничен одним сокетом?
- Может / будет ли один экземпляр приложения работать одновременно на нескольких сокетах?
Детали системы:
- ProLiant BL460c Gen9
- Intel Xeon E5-2670 v3
- Windows 2012 R2
1 ответ
Некоторые слоты / устройства ввода-вывода взаимодействуют напрямую с одним из процессоров (другие слоты могут связываться с другим). Есть преимущества выполнения работы, генерируемой этой картой / устройством ввода-вывода на этом процессоре.
Например, DDIO лучше всего подходит для процессора, подключенного к слоту PCI / устройству ввода-вывода.