相关文章推荐
聪明的墨镜  ·  .NET Framework4.7.2 ...·  1 年前    · 
可爱的可乐  ·  C++ Hello World ...·  1 年前    · 
坚强的机器猫  ·  docker - 在 Docker ...·  1 年前    · 

为什么系统监视器不显示正确的CPU亲和力?

0 人关注

我已经搜索了关于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

linux
multithreading
pthreads
Andres Gonzalez
Andres Gonzalez
发布于 2013-12-12
1 个回答
jim mcnamara
jim mcnamara
发布于 2013-12-14
已采纳
0 人赞同

你没有答案,我将给你我能做的:一些部分的帮助

假设你检查了pthread_setaffinity_np的返回值。

你如何分配你的cpuset是非常重要的,在主线程中创建它。对于你想要的东西。它将传播到连续的线程。 你检查了返回代码吗?

你实际得到的cpuset将是硬件可用cpus和你定义的cpuset的交叉点。 下面的代码中的 min.h 是一个通用的构建包含文件。 你必须定义 _GNU_SOURCE 。- 请注意 comment on the last line of the code. CPUSET CPUSETSIZE 是宏。 我想我在其他地方定义了它们,我不记得了。 它们可能在一个标准头中。

#define _GNU_SOURCE
#include "min.h"
#include <pthread.h>
main(int argc, char **argv)
    int s, j;
    cpu_set_t cpuset;
    pthread_t tid=pthread_self();
    // Set affinity mask to include CPUs 0 & 1
    CPU_ZERO(&cpuset);
    for (j = 0; j < 2; j++)
        CPU_SET(j, &cpuset);
    s = pthread_setaffinity_np(tid, sizeof(cpu_set_t), &cpuset);
    if (s != 0)
        fprintf(stderr, "%d ", s);
        perror(" pthread_setaffinity_np");
        exit(1);
     // lets see what we really have in the actual affinity mask assigned our thread
    s = pthread_getaffinity_np(tid, sizeof(cpu_set_t), &cpuset);
    if (s != 0)
        fprintf(stderr, "%d ", s);
        perror(" pthread_setaffinity_np");
        exit(1);
    printf("my cpuset has:\n");
    for (j = 0; j < CPU_SETSIZE; j++)
        if (CPU_ISSET(j, &cpuset))
            printf("    CPU %d\n", j);