在Linux X86中使用任务集在独立CPU上运行进程的不同行为

cuxqih21  于 2023-11-17  发布在  Linux
关注(0)|答案(1)|浏览(125)

我正在运行一个性能测试,其中将一组进程/线程放入Linux中的一组隔离CPU中。
让我以/usr/bin/stress为例来展示Linux 4.18.20中的不同行为。
系统中有16个CPU,CPU 2-13被隔离,isolcpus=2-13。
测试1,taskset -c 2-13 /usr/bin/stress -c 12。目标是在CPU 2-13中运行12个压力示例。但实际上,所有压力示例都放在CPU 2中,而不是其他CPU。
测试2,taskset -c 2-13 chrt -f 1 /usr/bin/stress -c 12.这一次,12个示例被放入12个CPU中,每个示例都在特定的CPU上。
所以问题是为什么测试1和2得到了不同的行为,内核的哪个部分导致了这种差异?

一个演示代码,有两个pthreads。

#include <stdio.h>
#include <pthread.h>
#include <signal.h>
#include <unistd.h>

pthread_t thread1, thread2;

// Thread function for thread 1
void* thread1Function(void* arg)
{
    printf("Thread 1: Running\n");
    while (1) {
        sleep(1);
    }
    pthread_exit(NULL);
}

// Thread function for thread 2
void* thread2Function(void* arg)
{
    printf("Thread 2: Running\n");

    // Infinite loop to keep the thread alive
    while (1) {
        sleep(1);
    }

    pthread_exit(NULL);
}

int main(int argc, char **argv)
{
    // Create thread 1
    if (pthread_create(&thread1, NULL, thread1Function, NULL) != 0) {
        printf("Error creating thread 1\n");
        return 1;
    }

    // Create thread 2
    if (pthread_create(&thread2, NULL, thread2Function, NULL) != 0) {
        printf("Error creating thread 2\n");
        return 1;
    }

    // Wait for both threads to finish
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    return 0;
}

字符串

zzwlnbp8

zzwlnbp81#

isolcpus和taskset并不总是遵守提供的CPU范围。进程的每个线程都需要显式管理。
例如,当您使用taskset或sched_setaffinity为固定进程指定允许的CPU范围时,只使用允许范围内的第一个CPU,而不管进程中的线程数。
为了解决这个问题,我试图将我的进程的所有线程设置为RT优先级,并且在使用taskset命令运行进程后,它们得到了均匀的放置,这与您在chrt命令中看到的行为相同。

相关问题