上一篇重点在Numa架构下如果绑定,这篇就说说在非numa架构下常用的绑定吧。
使用taskset这个命令进行绑定,这个命令无法对内存进行限制,所以,如果有特殊需要,也可以使用Numa下的命令进行绑定和设置。这个命令用16进程maks来表示cpu
例:0x0000 0003 ----代表的是0和1CPU,0x0000 0001---代表的是0号CPU
计算方法:把3换成二进制为0011,从右向左分别代表0,1,2,3,
如果我想使用第7号CPU呢?可以用0x0000 0080(自己想的,man里面没。。)
如果0xffffffff就代表所有的cpu。
命令的格式:taskset -p mask pid (mask为16进制数,pid为程序运行的pid)
或者使用 taskset -c 0-3,5 pid(-c为指定cpu号,中间用逗号分隔,连续的cpu使用-)
虽然taskset可以绑定进程到cpu,但是那些没有绑定的,还是有可能被分配到这个cpu上,而且taskset重启就失效了,所以我们在来说另一个方法:
利用cpu隔离和隔离irq中断的技术,让我们的某些cpu专门运行用户进程,而系统进程和irq中断都由隔离出来的cpu计算并相应。
CPU隔离:修改/etc/grub.conf,使用isolcpus
irq中断,首先先查询一下,看看目前某中断使用的是哪个CPU,如图:
可以看到,最后一位为f,0-16个都可以使用,那么我们修改一下,让它只可以在0号cpu上进行中断:
Ok,这样,irq1中断就会通告0号cpu了。 在修改前后,你可以通过观察/proc/interrupts查看中断变化信息!
通过 ps -eo pid,args:50,psr 可以查看程序运行在哪个cpu上。
以上的结合使用,可以实现,系统和irq专门运行内某几个cpu上,而用户进程专门运行在某几个cpu上,这样可以提高缓存的命中率,降低了某些cpu的负载和频繁的切换时间。