Linux系统中,进程绑定CPU主要有两种方式:1.使用taskset命令,如:taskset -pc 1,2,3 {pid};2.调用设置CPU亲和度的系统函数sched_setaffinity()。
目前遇到一种情况,使用taskset命令或sched_setaffinity()为某些进程绑核后,使用pidstat -p {pid}查看进程运行所在CPU,没有切换到指定的核。
经过辗转排查,在/proc/sched_debug文件,发现CPU调度次数一直没有变化,即进程一直停留在当前CPU:
使用gdb调试该进程,发现主线程停留在recv_from(),即阻塞模式接收UDP消息,在收到消息前,进程处于阻塞状态,不能从当前CPU释放,也就不能被系统调度到其他CPU。
测试发现,如果进程收到想要的UDP消息,即结束阻塞调用,可以切换到绑定的核。