让我详细描述一下我们的要求。我们正在做某种作业,需要通过 NIC 卡捕获 IP 数据,然后实时处理捕获的数据。捕获数据的处理可以部分或全部完成,具体取决于 CPU 的可用性。但任何可以做的事情都将实时完成。
我们的架构如下。我们使用一个线程从 NIC 卡捕获 IP 数据。并创建多个线程来实时处理捕获的数据,这个数字可以达到任意数量(比如 500),这些线程都是 CPU 固有线程。
以下是我们的观察结果:请注意,我们有一个用于 IP 数据捕获的线程。当我们创建较少的处理线程(例如 10 个)并且总共消耗大约 95% 的 CPU 时,IP 数据捕获线程绝对没有问题。但是当我们创建大量处理线程(例如 250 个)并且总共消耗大约 80% 的 CPU 时,捕获线程无法正确捕获 IP 数据。在后一种情况下,CPU 可用性更高,但问题发生了。
因此我们认为问题可能出在线程数量及其调度(以及上下文切换)上。我们考虑了以下线程之间的 CPU 分配方式。使用亲和性,我们将 25% 的核心设置为捕获线程,将 75% 的核心设置为其他处理线程。
首先,我们在四核 i7 机器上编写了一个简单的程序,并开启了 HT。假设逻辑核心为 A1 A2 B1 B2 C1 C2 D1 D2(ABCD 为实际核心)。我们的示例线程消耗单个 HT 核心上的所有资源。因此,如果我在总共 8 个逻辑核心上运行 8 个这样的线程,则 CPU 消耗将显示 100%。现在我们尝试分配亲和性。如果我们创建 2 个核心并将亲和性设置为 A1 和 B1(这不是一个线程到 A1 而另一个线程到 B1,而是两个线程的组合亲和性),那么它可以正常工作,CPU 使用率显示 25%。但如果我们将两个线程的组合亲和性设置为 A1 和 A2,则仅消耗 12.5%(任务管理器显示仅使用了一个核心)。但如果我们将 4 个线程的亲和性设置为 A1、A2、B1、B2,则 CPU 使用率显示 50%。那么问题是为什么第二种情况(12.5%)不起作用?