linux下把进程/线程绑定到特定cpu核上运行?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下把进程/线程绑定到特定cpu核上运行?相关的知识,希望对你有一定的参考价值。
linux下把进程/线程绑定到特定cpu核上运行
你那个是系统下把CPU的核说钉在五河以下是比较好的,因为吧和内心压力非常大,发热量非常大。 参考技术A Linux提供一个接口,可以将进程绑定到特定的CPU:#include <sched.h>
int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask); 参考技术B 使用taskset指令
获取进程pid
-> % ps
PID TTY TIME CMD
2683 pts/1 00:00:00 zsh
2726 pts/1 00:00:00 dgram_servr
2930 pts/1 00:00:00 ps
查看进程当前运行在哪个cpu上
-> % taskset -p 2726
pid 2726's current affinity mask: 3
显示的十进制数字3转换为2进制为最低两个是1,每个1对应一个cpu,所以进程运行在2个cpu上。
指定进程运行在cpu1上
-> % taskset -pc 1 2726
pid 2726's current affinity list: 0,1
pid 2726's new affinity list: 1
注意,cpu的标号是从0开始的,所以cpu1表示第二个cpu(第一个cpu的标号是0)。
至此,就把应用程序绑定到了cpu1上运行,查看如下:
-> % taskset -p 2726
pid 2726's current affinity mask: 2
启动程序时绑定cpu
#启动时绑定到第二个cpu
-> % taskset -c 1 ./dgram_servr&
[1] 3011
#查看确认绑定情况 《Linux就 该这么学》
-> % taskset -p 3011
pid 3011's current affinity mask: 2
Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux)
Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux)
文章目录
关键字:
CPU
、
Qt
、
Linux
、
线程
、
进程
内容背景:
最近项目终于切到Linux下开发了,所以最近的记录都是发生在
Debian 10
以及Arm Debain 10
下,Qt
版本5.12.3
。这几天真是问题多多,收获满满,不过目前阶段仅仅停留在解决问题,至于原理性的东西,还得慢慢消化。最近好多问题都是直接群里问大神,感谢各位大神助我成长。
摘要
哎呀,说多了都是泪,一直以为Arm Linux 天下无敌,谁知道性能还是没法和PC比,不过也是,毕竟功耗在那摆着呢。这不,最近遇到了一个问题,就是使用QCustomPlot绘制曲线的时候,在一屏200个点的时候没有问题,但是当我绘制 8K×5×2
个点的时候,就卡的要死要死的,虽然加入了线程,但是还是未解决,所以就想到了这个,设置CPU亲缘性,但是每个平台的设置方式还不一样,所以今天的这个是在Linux
下的,具体是在Debian 10
Qt 5.12.3
下测试。
1 什么是CPU亲缘性
这里我也就只能是现学现卖;
亲缘性的作用就是把线程or进程与CPU做黏合,也就是说,做了亲缘性的线程或进程,只会在这一个CPU核上运行,只在这一个CPU核上被调度,且不会切换到其他的CPU核上运行。这就是亲缘性。
以上引用来之:https://blog.csdn.net/qq_42956653/article/details/126160543
2 目的
为了让程序拥有更好的性能,有时候需要将进程或线程绑定到特定的CPU,这样可以减少调度的开销和保护关键进程或线程
以上应用来之:https://blog.csdn.net/tbadolph/article/details/101363120?spm=1001.2014.3001.5506
3 API 介绍
本节一下内容来之:https://blog.csdn.net/tbadolph/article/details/101363120?spm=1001.2014.3001.5506
3.1 进程绑定到CPU
Linux提供一个接口,可以将进程绑定到特定的CPU:
#include <sched.h>
int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
参数
pid:进程的id号,如果pid为0,则表示本进程
cpusetsize:mask的大小
mask:运行进程的CPU,可以通过以下函数操作mask
#define CPU_SET(cpu, cpusetp) //设置cpu
#define CPU_CLR(cpu, cpusetp) //删除cpu
#define CPU_ISSET(cpu, cpusetp) //判断cpu
#define CPU_ZERO(cpusetp) //初始化为0
3.2 线程绑定到CPU
不仅仅进程可以绑定到CPU,线程也可以。Linux提供一个接口,可以将线程绑定到特定的CPU:
#include <pthread.h>
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset);
该接口与进程绑定到CPU的接口的使用方法基本一致。当进程绑定到特定的CPU之后,线程还是可以绑定到其他的CPU的,没有冲突。
4 实际操作
在我的项目里面,暂时有主进程,串口数据处理线程和USB数据处理线程,如下图所示,我将主进程绑定到了CPU:0上,将串口线程绑定到了CPU:1上,将USB数据处理线程绑定到了 CPU:2 上。
4.1 实操代码
主进程
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(0,&mask);
if(sched_setaffinity(0,sizeof(cpu_set_t),&mask) < 0)
qDebug() << "False:" << "sched_setaffinity(0,sizeof(cpu_set_t),&mask)";
串口线程
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(1,&mask);
if(pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0)
qDebug() << "False:" << "pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask)" << LOGINFOR;
USB线程
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(2,&mask);
if(pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0)
qDebug() << "False:" << "pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask)" << LOGINFOR;
程序运行资源管理器截图
虚拟机测试
可以看到两个明显的处理,每次都是运行在CPU 1 和 3 上,因为串口没有接,所以低一点,淹没在下面的曲线里面了
板子测试
这里我还没有找到那个对应那个,也不知道程工没有。
以上是关于linux下把进程/线程绑定到特定cpu核上运行?的主要内容,如果未能解决你的问题,请参考以下文章
Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux)