之前在tilera上看GX36多核处理器中关于多核处理器工作过程,Linux内核默认处理任务的方式按道理来说是使多核处理能力得到足够的利用,如果当前有4个processor,那么一个任务过来发现第一个处理器正在忙,那么他就会看第二个处理器是否是处于忙的状态,如果第二个处理器同样也是忙的状态的话,那么他就看下一个,直到找到一个不忙的处理器,然后再上面运行程序;如果没有找到那么他就会自动送到第一个处理器的队列里,等待处理;这个是我之前的理解。以上是默认分配处理单元的方式;同样Linux也支持使用手动设置进程亲和性的方式来指定当前程序运行在那个处理单元上。Linux为此提供了taskset指令。
1、 运行需要绑定的程序
2、 查找当前程序的pid
ps -ef | grep test
3、 绑定当前运行进程1728到指定处理器1上;
root@desktop:~# taskset -p 2 1782
pid 1782's current affinity mask: 3
pid 1782's new affinity mask: 2
4、通过ps -eo pid,args,psr查看当前进程运行在那个CPU上;
1782 1
5、执行top 然后按1,查看CPU工作状态;
Cpu0 : 11.7%us, 13.0%sy, 0.0%ni, 75.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
6、 发现所有开销都在cpu0上,并不是想要的1上;
7、 这时候关闭进程使用taskset -c 1 /path/test 重新运行程序
注:这里1指的是processor号,也就是CPU1;
8、查看当前运行进程的所运行的处理器 ps -eo pid,psr
1883 1
注:这里说明当前程序运行在CPU1上;设置成功;
9、使用TOP查看CPU工作状态
Cpu0 : 0.0%us, 0.0%sy, 0.0%ni, 99.3%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 10.9%us, 8.7%sy, 0.0%ni, 80.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
注:这里发现程序开销在CPU1上,实现预期设置。