上一篇重点在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,如图:

            CPU性能监控之三-----非Numa架构的进程绑定_isolcpus

      可以看到,最后一位为f,0-16个都可以使用,那么我们修改一下,让它只可以在0号cpu上进行中断:

            CPU性能监控之三-----非Numa架构的进程绑定_taskset_02

      Ok,这样,irq1中断就会通告0号cpu了。 在修改前后,你可以通过观察/proc/interrupts查看中断变化信息!

      通过 ps -eo pid,args:50,psr  可以查看程序运行在哪个cpu上。

     以上的结合使用,可以实现,系统和irq专门运行内某几个cpu上,而用户进程专门运行在某几个cpu上,这样可以提高缓存的命中率,降低了某些cpu的负载和频繁的切换时间。