我正在运行一个性能测试,其中将一组进程/线程放入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;
}
字符串
1条答案
按热度按时间zzwlnbp81#
isolcpus和taskset并不总是遵守提供的CPU范围。进程的每个线程都需要显式管理。
例如,当您使用taskset或sched_setaffinity为固定进程指定允许的CPU范围时,只使用允许范围内的第一个CPU,而不管进程中的线程数。
为了解决这个问题,我试图将我的进程的所有线程设置为RT优先级,并且在使用taskset命令运行进程后,它们得到了均匀的放置,这与您在chrt命令中看到的行为相同。