【调试工具】taskset 设置处理器的亲和度

一、功能介绍

taskset命令用于设置进程(或 线程)的处理器亲和性(Processor Affinity),可以将进程(或 线程)绑定到特定的一个 或 多个CPU上去执行,而不允许将进程(或 线程)调度到其他的CPU上。


二、用户进程使用

1.编写测试程序

c 复制代码
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    char *env;

    env = getenv("PATH");
    
    printf("PATH: %s\n", env);
    
    while(1);
    
   return 0;
}

2.查看进程 输出结构处理器亲和性掩码是f,表示进程(或线程)可以在Host上让任何一个CPU运行。查看进程(或 线程)允许允许CPU范围使用-c参数。 cpu核心数为4,分别为cpu0、cpu1、cpu2、cpu3

3.查看当前在运行在哪个cpu上

pidstat -p 2778

可以看到当前是在cpu0上运行。

4.绑定到其它单个cpu

taskset -p 01 2778   // 绑定到 cpu 1

taskset -p 02 2778  // 绑定到 cpu2

5.绑定CPU亲和性指定一组范围

taskset -pc 1,2,3,4 pid  // -c指定cpu 1 2 3 4 taskset -p 0x7 pid    // 0x7 -- 0111, 指定cpu 1 2 3


三、内核线程使用

内核中是调用 set_cpus_allowed_ptr 函数去实现的,示例如下:

c 复制代码
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/kthread.h>
 
struct task_struct *task0;
static spinlock_t spinlock;
int val;
 
int task(void *arg)
{
    printk(KERN_INFO "%s:%d\n",__func__,__LINE__);
    /* To generate panic uncomment following */
    /* panic("softlockup: hung tasks"); */
 
    while(!kthread_should_stop()) {
        printk(KERN_INFO "%s:%d\n",__func__,__LINE__);
        spin_lock(&spinlock);
        /* busy loop in critical section */
        while(1) {
            printk(KERN_INFO "%s:%d\n",__func__,__LINE__);
        }
 
        spin_unlock(&spinlock);
    }
 
    return val;
}
 
static int softlockup_init(void)
{
    printk(KERN_INFO "%s:%d\n",__func__,__LINE__);
 
    val = 1;
    spin_lock_init(&spinlock);
    task0 = kthread_run(&task,(void *)val,"softlockup_thread");
    set_cpus_allowed_ptr(task0, cpumask_of(0));  //调用该接口绑定
 
    return 0;
}
 
static void softlockup_exit(void)
{
    printk(KERN_INFO "%s:%d\n",__func__,__LINE__);
    kthread_stop(task0);
}
 
module_init(softlockup_init);
module_exit(softlockup_exit);

四、总结

在项目开发过程中,某些cpu的使用率很高,而有些使用率较低,我们可以尝试使用设置cpu的亲和度来调整不同cpu上的task

相关推荐
写代码的学渣5 小时前
ubuntu 22.04 新装的系统 xshell 连不上
linux·运维·ubuntu
序属秋秋秋5 小时前
《Linux系统编程之进程环境》【环境变量】
linux·运维·服务器·c语言·c++·操作系统·系统编程
云计算练习生6 小时前
linux shell编程实战 10 Git工具详解与运维场景实战
linux·运维·git
虚伪的空想家8 小时前
KVM的ubuntu虚机如何关闭安全启动
linux·安全·ubuntu
t1987512814 小时前
在Ubuntu 22.04系统上安装libimobiledevice
linux·运维·ubuntu
skywalk816314 小时前
linux安装Code Server 以便Comate IDE和CodeBuddy等都可以远程连上来
linux·运维·服务器·vscode·comate
晚风吹人醒.15 小时前
缓存中间件Redis安装及功能演示、企业案例
linux·数据库·redis·ubuntu·缓存·中间件
Hard but lovely15 小时前
linux: pthread库的使用和理解
linux
这儿有一堆花17 小时前
Kali Linux:探测存活到挖掘漏洞
linux·运维·服务器
松涛和鸣17 小时前
从零开始理解 C 语言函数指针与回调机制
linux·c语言·开发语言·嵌入式硬件·排序算法