Linux 绑定中断和进程给指定CPU
一,绑定中断到CPU查看系统中断irqcat /proc/interruptsCPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU70: 51 0 0 0 0 0 0 0 IO-APIC 2-edg...
一,绑定中断到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);
}
更多推荐
所有评论(0)