【Linux】隔核绑核

隔核:指定的cpu核心只参与最低限度的OS内核计算
绑核:运行程序时只使用指定的CPU核心

隔核方法1:修改grub
环境:CentOS7
具体步骤:

vim /etc/default/grub 修改 GRUB_CMDLINE_LINUX="... isolcpus=1-2,7-8" 隔离1278核心
grub2-mkconfig -o /boot/grub2/grub.cfg 更新配置
//或者使用update-grub,它是ubuntu特有的用来配置grub.cfg的命令
reboot 重启
cat /proc/cmdline 查看结果

绑核方法1:taskset命令或设置线程属性
taskset命令用法:

taskset -cp cpu-list pid(cpu-list 与上文的隔核写法类似,pid是进程id)

隔核方法2:

vim /etc/tuned/realtime-variables.conf

绑核方法2:

#include <sched.h>

void bind_core(int core_i){
	cpu_set_t cpus;
	CPU_ZERO(&cpus);
	CPU_SET(core_i, &cpus);
	if(sched_setaffinity(0,sizeof(cpus),&cpus) == -1){
		ERROR("failed bind core %u",core_i);
	} else {
		INFO("success to core %u",core_i);
	}
}

查看cpu有几个核

使用 cat /proc/cpuinfo 查看cpu信息,如下两个信息:

  • processor,指明第几个cpu处理器
  • cpu cores,指明每个处理器的核心数

也可以使用系统调用sysconf获取cpu核心数:

#include <unistd.h>

int sysconf(_SC_NPROCESSORS_CONF);// 返回配置的处理器个数
int sysconf(_SC_NPROCESSORS_ONLN);// 返回当前可获得的处理器个数

#include "sys/sysinfo.h"
int get_nprocs_conf(void);// 返回配置的处理器个数
int get_nprocs(void);// 返回当前可获得的处理器个数

綁定进程到cpu核心上运行
使用sched_setaffinity函数,其原型如下:

#define _GNU_SOURCE //see feature_test_macros(7)
#include <sched.h>

int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
/*
* 设置进程号为pid的进程运行在mask所设定的cpu上
* 第二个参数cpusetsize是mask所指定的数的长度
* 通常设定为sizeof(cpu_set_t)
* 如果pid的值为0,则表示指定的是当前进程
*/

int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
/* 
* 获得pid所指示的进程的cpu位掩码,并将该掩码返回到mask所指向的结构中
*/

绑定线程到cpu核心上运行

#define _GNU_SOURCE //see feature_test_macros(7)
#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_set_t这个结构体了。这个结构体的理解类似于select中的fd_set,可以理解为cpu集,也是通过约定好的宏来进行清除、设置以及判断:
//初始化,设为空
void CPU_ZERO (cpu_set_t *set); 
//将某个cpu加入cpu集中 
void CPU_SET (int cpu, cpu_set_t *set); 
//将某个cpu从cpu集中移出 
void CPU_CLR (int cpu, cpu_set_t *set); 
//判断某个cpu是否已在cpu集中设置了 
int CPU_ISSET (int cpu, const cpu_set_t *set);

注:因引导系统的不同,可能造成隔核方法1失败

[ -d /sys/firmware/efi ] && echo UEFI || echo BIOS

查看系统引导方式是UEFI还是BIOS
然后

1、vim /etc/default/grub 修改GRUB_CMDLINE_LINUX="... isolcpus=1-2,7-8"
if BIOS :
2.grub2-mkconfig -o /boot/grub2/grub.cfg 更新配置
else if UEFI :
2.grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
3.reboot 重启
4.cat /proc/cmdline 查看结果

区别在step2不同的引导系统需要不同的配置稳健来设置启动参数

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值