我已经搜索了关于CPU亲和力的问题/答案,并阅读了结果,但我仍然无法让我的线程钉在单个CPU上。
我正在开发一个应用程序,将在一个专门的Linux盒子上运行,所以我不关心其他进程,只关心我自己的进程。这个应用程序目前在一个pthread上生成,然后主线程进入一个while循环,使用POSIX msg队列处理控制信息。这个 while 循环阻塞等待控制信息的到来,然后处理它。因此,主线程是非常简单和非关键的。我的代码工作得非常好,因为我可以向这个应用程序发送消息,它可以很好地处理它们。所有的控制信息都非常小,只是用来控制应用程序的功能,也就是说,只有少数控制信息被发送/接收。
在我进入这个while循环之前,我使用sched_getaffinity()来记录所有可用的CPU。然后我使用 sched_setaffinity() 将这个进程设置为一个 CPU。然后我再次调用 sched_getaffinity() 来检查它是否被设置为只在一个 CPU 上运行,确实是正确的。
被催生出来的那个单一的pthread也做了类似的事情。我在新创建的pthread中做的第一件事是调用pthread_getaffinity_np()并检查可用的CPU,然后调用pthread_setaffinity_np()将其设置为不同的CPU,然后调用pthread_getaffinity_np()来检查是否如愿设置,确实正确。
这就是令人困惑的地方。当我运行应用程序并在系统监视器中查看CPU历史记录时,我看到与我在没有设置亲和力的情况下运行应用程序时没有区别。调度器仍然在这个四核盒子的每个CPU上运行几秒钟。因此,调度器似乎忽略了我的亲和力设置。
我期待看到一些证据,证明主线程和pthread实际上是在自己的单一CPU中运行,这难道是错的吗? 或者我忘记了做一些事情,使其按照我的意图工作?
-Andres