gpt4 book ai didi

c++ - 当多个高优先级线程在多个内核上运行时,Linux 内核无响应

转载 作者:IT王子 更新时间:2023-10-29 00:37:43 24 4
gpt4 key购买 nike

编写了一个运行 10 个线程的示例 C++ 多线程程序,每个线程都设置为高优先级和亲和性。在具有 16 个内核的戴尔机器上编译并运行此代码,运行 centos 7(Linux 内核 - 3.10.0-229),禁用超线程。在我运行这段代码后,几秒钟后,我们的 Linux 机器变得没有响应,从某种意义上说,如果我打开 Eclipse 编辑器,并保存文件或在 vi 编辑器中保存文件,那些应用程序就会挂起。有趣的是,一旦我停止这个程序/进程,所有其他应用程序就会从它们停止的地方恢复。如果我从这 10 个线程中删除优先级,我也看不到这个问题。

问题:

1) 在 16 个内核中,还有 6 个内核留在机器上(上面的 cpu 使用率显示,cpu 执行了 62.9% 的用户空间,空闲了 37.1%。有趣的是,内核空间中的 cpu 使用率为 0%),所以理想情况下内核应该使用这 6 个核心来处理其他应用程序,其他应用程序无法运行的原因可能是什么?如何在不引休眠眠/改变优先级的情况下解决这个问题?

2) 除了在线程中引休眠眠/等待事件(由于内核上下文切换引入最小延迟)之外,想知道更好的方法来实现并行性吗?

运行top命令(top -H):

%Cpu(s):  62.9 us,  0.0 sy,  0.0 ni, 37.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

1107 arun rt 0 96748 1112 932 R 99.9 0.0 0:25.78 PthreadTest
1115 arun rt 0 96748 1112 932 R 99.9 0.0 0:24.79 PthreadTest
1118 arun rt 0 96748 1112 932 R 99.9 0.0 0:22.79 PthreadTest
1120 arun rt 0 96748 1112 932 R 99.9 0.0 0:20.79 PthreadTest
1123 arun rt 0 96748 1112 932 R 99.9 0.0 0:18.79 PthreadTest
1117 arun rt 0 96748 1112 932 R 94.1 0.0 0:23.78 PthreadTest
1119 arun rt 0 96748 1112 932 R 94.1 0.0 0:21.78 PthreadTest
1122 arun rt 0 96748 1112 932 R 94.1 0.0 0:19.78 PthreadTest
1124 arun rt 0 96748 1112 932 R 94.1 0.0 0:17.78 PthreadTest
1125 arun rt 0 96748 1112 932 R 94.1 0.0 0:16.76 PthreadTest

代码如下:

#include <unistd.h>
#include <iostream>
#include <cstdlib>
#include <pthread.h>

using namespace std;

#define NUM_THREADS 10

void *PrintHello(void *threadid)
{
long tid;
tid = (long)threadid;

cout << "Hello World! Thread ID, " << tid << endl;
while(true)
{
continue;
}
pthread_exit(NULL);
}

int main ()
{
pthread_t threads[NUM_THREADS];
pthread_attr_t threads_attr[NUM_THREADS];
struct sched_param params;
params.sched_priority = sched_get_priority_max(SCHED_FIFO);
int rc;
int i;
int cpu_num = 0;

for( i=0; i < NUM_THREADS; i++ ){

cpu_set_t cpu;
CPU_ZERO(&cpu);
CPU_SET(cpu_num, &cpu);
cout << "main() : creating thread, " << i << "cpu_num : "<<cpu_num<<endl;
pthread_attr_init(&threads_attr[i]);
pthread_attr_setscope(&threads_attr[i], PTHREAD_SCOPE_SYSTEM);
rc = pthread_create(&threads[i], NULL,
PrintHello, (void *)i);
if (rc){
cout << "Error:unable to create thread," << rc << endl;
exit(-1);
}

sleep(1);


int ret = pthread_setaffinity_np(threads[i], sizeof(cpu_set_t), &cpu);
if(ret == 0 && CPU_ISSET(cpu_num, &cpu))
{
cout << "Thread " << i << " affinity set " <<endl;
}


ret = pthread_setschedparam(threads[i], SCHED_FIFO, &params);
if(ret == 0)
{
cout << "Thread " << i << " priority set " <<endl;
}
cpu_num++;
}


// free attribute and wait for the other threads
void *status;
for( i=0; i < NUM_THREADS; i++ )
{
rc = pthread_join(threads[i], &status);
if (rc){
cout << "Error:unable to join," << rc << endl;
exit(-1);
}
cout << "Main: completed thread id :" << i ;
cout << " exiting with status :" << status << endl;
}

pthread_exit(NULL);
}

编译:

g++ -std=c++14 -g -o PthreadTest busywait.cpp -lpthread

最佳答案

突然无限期地剥夺内核对事件内核的任何使用的影响是不确定和未知的。在获得独占所有权之前附加到该核心的任何内容(可能包括等待在其上调度的线程)都会永远丢失给系统。

不要这样做!

关于c++ - 当多个高优先级线程在多个内核上运行时,Linux 内核无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33533494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com