
正文
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 | grep instance找到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,可以逐步观察找到对应的应用。
相关问答
Q1: linux 查看线程绑定在哪个核心 proc
使用top命令,具体用法是 top -H,加上这个选项,top的每一行就不是显示一个进程,而是一个线程。
使用ps命令,具体用法是 ps -xH,这样可以查看所有存在的线程,也可以使用grep作进一步的过滤。
使用ps命令,具体用法是 ps -mq PID,这样可以看到指定的进程产生的线程数目。
更进一步,其实一些系统监控工具,在本质上也是读取的系统产生的文件罢了。
Q2: 如何将一个进程(线程)绑定到一个固定的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 -p PID 来获得此Process的 CPU affinity。
eg: taskset -p 2915 ------ pid 2915's current affinity mask:ff; ff=="1111 1111",没一个1代表一个核,共8个核,能用的核数也为8个核。
2.2 使用命令 taskset -cp PID 可获得数字形式的CPU affinity。
eg: taskset -cp 2915 ------ pid 2915's current affinity list: 0--7。
接下来为将进程pin到某个核上的命令;
2.3 taskset -p COREMASK PID
eg:taskset -p 0x11 9030 ------pid 9030's current affinity mask: ff , pid 9030's new affinity mask: 11 。意思就是将此进程绑定到了CPU core 0 and 4。
2.4 taskset -cp CORE-LIST PID
eg:taskset -cp 0,4 9030 ------the same as below.
With "-c" option, you can specify a list of numeric CPU core IDs separated by commas, or even include ranges (e.g., 0,2,5,6-10).
2.5 taskset COREMASK EXECUTABLE
eg: taskset 0x1 xxxx -----"xxxx" represented the name of one program.
另外:参考文章最后的位置说到,绑定到此物理核之后,别的进程(线程)还可以调度到此核上执行,但是没说绑定的这个线程没执行完之前是否会被别的线程挤掉。根据我的观察是不会被挤掉,这我在文章的开头也有提到。
Q3: linux核隔离绑定区别
Linux核隔离和绑定都是Linux内核对进程和CPU资源的管理机制linux绑核命令,但是它们的概念和作用有所不同。
1. 核隔离(CPU isolation):核隔离是指将CPU核心绑定到一个或多个特定进程上linux绑核命令,从而实现不同进程之间的CPU资源隔离linux绑核命令,避免不同进程之间的CPU竞争,并提高CPU利用率。这种方法需要使用cpuset控制工具进行设置,用于分配CPU资源给指定的进程组。
2. 绑定(CPU affinity):绑定是指将一个或多个特定的CPU核心分配给某个进程或线程,使其只能在该CPU核心上运行,其他CPU核心不参与该进程或线程的调度。通过绑定CPU核心可以避免缓存变冷、页表失效等问题,提高CPU缓存命中率和应用程序性能。这种方法需要使用taskset命令来实现。
总之,在不同的应用场景下,可根据需求选择不同的CPU资源管理机制,以便更好地管理和利用CPU资源。
Q4: Linux如何将进程绑定运行在指定CPU上
绑定cpu方式:
c语言:
sched_setaffinity(0, sizeof(mask), mask)
shell命令:
在grup启动时传给内核参数: isolcpus=2-15, 这里表示隔离第3到16个CPU, Linux程序只跑在第一和第二个CPU上, 空闲的CPU我们可以指定跑进程了.
这是内核文档里对内核参数的解释:
isolcpus= [KNL,SMP] Isolate CPUs from the general scheduler.
Format:
cpu number,...,cpu number
or
cpu number-cpu number
(must be a positive range in ascending order)
or a mixture
cpu number,...,cpu number-cpu number
This option can be used to specify one or more CPUs
to isolate from the general SMP balancing and scheduling
algorithms. You can move a process onto or off an
"isolated" CPU via the CPU affinity syscalls or cpuset.
cpu number begins at 0 and the maximum value is
"number of CPUs in system - 1".
This option is the preferred way to isolate CPUs. The
alternative -- manually setting the CPU mask of all
tasks in the system -- can cause problems and
suboptimal load balancer performance.
linux nice 命令详解
功能说明:设置优先权。
语法:nice [-n 优先等级][--help][--version][执行指令]
补充说明:nice指令可以改变程序执行的优先权等级。
参数:-n优先等级或-优先等级或--adjustment=优先等级 设置欲执行的指令的优先权等级。等级的范围从-20-19,其中-20最高,19最低,只有系统管理者可以设置负数的等级。
--help 在线帮助。
--version 显示版本信息。
linux renice 命令详解
功能说明:调整优先权。
语法:renice [优先等级][-g 程序群组名称...][-p 程序识别码...][-u 用户名称...]
补充说明:renice指令可重新调整程序执行的优先权等级。预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。等级范围从-20--19,只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级。
参数:
-g 程序群组名称 使用程序群组名称,修改所有隶属于该程序群组的程序的优先权。
-p 程序识别码 改变该程序的优先权等级,此参数为预设值。
-u 用户名称 指定用户名称,修改所有隶属于该用户的程序的优先权。
taskset设定cpu亲和力,cpu亲和力是指
CPU调度程序属性关联性是“锁定”一个进程,使他只能在一个或几个cpu线程上运行。对于一个给定的系统上设置的cpu。给定CPU亲和力和进程不会运行在任何其他CPU。注意,Linux调度器还支持自然CPU关联:(不能让这个cpu只为这一个进程服务)
这里要注意的是我们可以把某个程序限定在某一些CPU上运行,但这并不意味着该程序可以独占这些CPU,其实其他程序还是可以利用这些CPU运行。如果要精确控制CPU,taskset就略嫌不足,cpuset才是可以
-a, --all-tasks 操作所有的任务线程-p, --pid 操作已存在的pid-c, --cpu-list 通过列表显示方式设置CPU
(1)指定1和2号cpu运行25718线程的程序
taskset -cp 1,2 25718
(2),让某程序运行在指定的cpu上 taskset -c 1,2,4-7 tar jcf test.tar.gz test
(3)指定在1号CPU上后台执行指定的perl程序
taskset –c 1 nohup perl pi.pl
关于linux绑核命令和linux进程绑定cpu核的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。






