![在多处理器系统中,线程如何在核心之间分布?](https://linux22.com/image/658603/%E5%9C%A8%E5%A4%9A%E5%A4%84%E7%90%86%E5%99%A8%E7%B3%BB%E7%BB%9F%E4%B8%AD%EF%BC%8C%E7%BA%BF%E7%A8%8B%E5%A6%82%E4%BD%95%E5%9C%A8%E6%A0%B8%E5%BF%83%E4%B9%8B%E9%97%B4%E5%88%86%E5%B8%83%EF%BC%9F.png)
我目前正在检查具有两个 12 核处理器(即 24 核)的系统上的服务器应用程序的限制。(超线程当前已禁用)。
我在该盒子上运行了 12 个 UDP 接收密集型实例,根据任务管理器显示,它占用了 2 个插槽中一个的所有 12 个核心。但另一个插槽处于空闲状态。我还尝试启动该应用程序的第 13 个实例,但它仍然在第一个已经很忙的插槽上运行。
为什么?在多处理器系统中,线程调度到核心的规则是什么?
一些想法:
- 这是否与 RSS(接收方缩放)有关?它已启用并且至少会参与选择我们应用程序的接收线程的核心(但该应用程序也有其他工作繁重的线程)?
- RSS(或 MSI/MSI-X)是否仅限于一个插槽?
- 单个应用程序实例可以/将会同时在多个套接字上运行吗?
系统详细信息:
- ProLiant BL460c Gen9
- 英特尔至强 E5-2670 v3
- Windows 2012 R2
答案1
一些插槽/IO 设备直接与其中一个处理器通信(其他插槽可能与另一个处理器通信)。在该处理器上执行该卡/IO 设备生成的工作具有优势。
例如直接输入输出系统最适合连接到 PCI 插槽/IO 设备的处理器。