linux绑核命令 linux进程绑定cpu核

为何绑核后虚机上核还是被偷走的状态之前写过一个文章 介绍将进程绑定到指定linux绑核命令的CPU上 linux绑核命令,里边介绍了2个方法:Linux下taskset和虚拟化场景下virsh vcpupin指定CPU 。后来发现如果使用不当linux绑核命令,即使绑核了也会出现虚机CPU被偷走linux绑核命令的状态 。
究其根本原因是找到该物理机上没绑核的或绑核冲突的进程或虚机,也就是那个偷核的罪魁祸首 。
1) 查看是否被偷核的方法
在虚拟机top命令,查看每个核的st是否为0,有一个核非0则表示被偷核了 。
2) 如果是虚拟机所有核的st是非0  , 到该虚拟机所在物理机上查看该虚拟机是否绑核
控制节点上nova show vmid| grepinstance找到instance_id,
虚机所在物理机virsh list查到instance_id,
然后查看是否绑核virsh vcpupin instance_id
virsh vcpupin instance_idbb #未绑核
0: 0-39
virsh vcpupin instance_idaa #未绑核,绑定的是一个范围
0: 5-9
3) 如果该虚拟机绑核  , 该虚机所在物理机上查找其它虚机是否绑核
参考2)中的方法查看,如果其他虚拟机未绑核,将这些虚拟机绑核即可 。
virsh vcpupin instance_idbb #绑核
0: 5
4)如果该虚拟机未绑核 ,需要进行绑核 。这就涉及另外一个问题:未绑核虚机如何绑核,后面再详细说 。
5)如果该物理机上所有虚拟机均绑核,还是有被偷核的情况,需要详细查查某个进程是否占用了 。
从虚拟机上找到st非0的CPU , 再到物理机上找到该CPU对应的物理核 。2个方法:virsh dumpxml instance_id和virsh vcpupin instance_id 。
virsh vcpupin instance_idbb #绑核
0: 5
1:3
说明虚拟机第0核和物理机第5核相对应的 。如果是虚拟机的第0核的st非0,则说明物理机的第5核被其它应用被占用了 。
taskset cp pid可以查看每个进程占用的CPU , 可以逐步观察找到对应的应用 。
linux 查看线程绑定在哪个核心 proc使用top命令 , 具体用法是 top -H,加上这个选项,top的每一行就不是显示一个进程,而是一个线程 。
使用ps命令,具体用法是 ps -xH,这样可以查看所有存在的线程 , 也可以使用grep作进一步的过滤 。
使用ps命令,具体用法是 ps -mq PID,这样可以看到指定的进程产生的线程数目 。
更进一步,其实一些系统监控工具,在本质上也是读取的系统产生的文件罢了 。
如何将一个进程(线程)绑定到一个固定的CPU第一种:linux的shell命令行方式,命令名字为taskset 。第二种就是代码实现级别的了 , pthread_setaffinity_np和sched_setaffinity函数接口 。
第一种方式我已经验证过了,确实可行 。同时验证了我心中的疑问:如果将某个线程绑定到某个物理核上之后 , 在此线程运行结束前 , 会不会有别的线程被调度到此物理核上执行?写了一个死循环验证了下,发现绑定之后是不会调度别的线程在此核上运行的?。ㄈ庋酃鄄斓模辈皇惫鄄煜拢?没发现别的线程在此核上执行;对比了下没有绑定的情况,会发现过段时间此线程就会被调度到别的核心上执行)
此种方式有个问题 , 就是只有线程运行起来后才会被绑定到某个核上 , 不够及时 。
具体的方式为:
1.首先根据系统的差别运行如下安装命令:
sudo apt-get install util-linux(Debian,Ubuntu or Linux Mint)
sudo yum install util-linux(Fedora,CentOS or RHEL)
2.相关命令的使用:
2.1 使用命令 taskset-pPID 来获得此Process的 CPU affinity 。
eg: taskset -p 2915------ pid 2915's current affinity mask:ff; ff=="11111111",没一个1代表一个核,共8个核 , 能用的核数也为8个核 。

推荐阅读