一,绑定中断到CPU

查看系统中断irq

cat /proc/interrupts

           CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       
  0:         51          0          0          0          0          0          0          0   IO-APIC   2-edge      timer
  1:          9          0          0          0          1          0          0          0   IO-APIC   1-edge      i8042
  6:          0          0          0          0          0          2          0          0   IO-APIC   6-edge      floppy
  7:          0          0          0          0          0          0          0          0   IO-APIC   7-edge      parport0
  8:          1          0          0          0          0          0          0          0   IO-APIC   8-edge      rtc0
  9:          0          0          0          0          0          0          0          0   IO-APIC   9-fasteoi   acpi
 12:          1          0          0          0          2          0          1         12   IO-APIC  12-edge      i8042
 14:          0          0          0          0          0          0          0          0   IO-APIC  14-edge      ata_piix
 15:         45        234        510       8732     513357     609879     763550     478550   IO-APIC  15-edge      ata_piix
 16:          0          0          0          0          0          0          0          0   IO-APIC  16-fasteoi   vmwgfx
 17:       7605       1278        480        395       1259    8375667        745        625   IO-APIC  17-fasteoi   ioc0
 18:        450  312469355          0          0          0          0          0          0   IO-APIC  18-fasteoi   ens32

提取中断号

IID=`cat /proc/interrupts | grep timer|grep -v "grep" | awk -F : '{sub(/^[\t ]*/,"");print $1}'`;
echo "timer interrupt id:${IID}"

绑定中断号

echo 2 > /proc/irq/${IID}/smp_affinity

       /proc/irq/{IID}/smp_affinity 自身是一个位掩码(bitmask),文件默认是全部ffffffff,特定的位对应特定的 CPU,这样,01 就意味着只有第一个 CPU 可以处理对应的中断,而 0f(0x1111)意味着四个 CPU 都会参与中断处理。2 表示第二个CPU可以处理对应中断,3表示第一和第二个cpu处理这个中断以此类推。

二,进程绑定指定CPU上。

查看cpu个数和核数

# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq

# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l

查看进程绑定在哪个cpu

 #taskset -cp 12423
pid 12423's current affinity list: 0-7

绑定进程到cpu

taskset -cp bitmark 进程PID 或者 taskset -cp cpu-list pid

bitmark 文件默认是全部ff,特定的位对应特定的 CPU,这样,01 就意味着只有第一个 CPU 可以处理对应的进程,而 0f(0x1111)意味着四个 CPU 都会参与进程处理。2 表示第二个CPU可以处理对应进程,3表示第一和第二个cpu处理这个进程以此类推。

taskset -cp 3 12423 表示绑定第一和第二个cpu

cpu-list  是个起始结束 如范围1-2这样的,表示绑定在1和2上面;
taskset -cp 1-3 12423

代码实现进程绑定

获得cpu总核数,索引从0开始
int getCpuCount()
{
return sysconf(_SC_NPROCESSORS_CONF);
}

  //把进程分配到某个cpu上(从0开始,小于cpu核数-1)
   //大于等于0成功
  int cpuSetByPID(int pid, unsigned int cpu)
  {
    cpu_set_t mask;

  mask =  sched_get_affinity() (用来查看当前的位掩码)
    CPU_ZERO(&mask); //清空集合(掩码)
    CPU_SET(cpu, &mask); //把cpu序号加入到集合
    //把pid运行在mask所设定的CPU上
    int ret = sched_setaffinity(pid, sizeof(mask), &mask);
    printf(“sched_setaffinity(%d,%d)ret = %d\n”,pid<=0?getpid():pid, cpu, ret);
    //成功返回值是0
    return ret;
  }

用户态线程与CPU绑定

功能是获得线程自身的ID。
pthread_t pthread_self(void);

设置线程绑定cpu
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);

  int cpuSetBythread(int ptid, unsigned int cpu)
  {
    cpu_set_t mask;
    cpu_set_t mask;
    /* 初始化set集,将set设置为空*/
    CPU_ZERO(&mask);
    /* 依次将0、1号cpu加入到集合*/
   CPU_SET(0, &mask);
   CPU_SET(1, &mask);
   /*将当前线程程绑定到cpu */
   return pthread_setaffinity_np(ptid, sizeof(mask), &mask);
  }

Logo

更多推荐