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)

文章目录


关键字: CPUQtLinux线程进程

内容背景:

最近项目终于切到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核上运行?的主要内容,如果未能解决你的问题,请参考以下文章

kvm cpu的亲和性绑定配置

Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux)

linux 将进程或者线程绑定到指定的cpu上

linux shell 查看进程运行或绑定的cpu和绑定执行进程到特定cpu上执行的方法

[转帖]判断Linux进程在哪个CPU核运行的方法

Linux 进程、线程和CPU的关系,cpu亲和性