linux中进程亲和性绑定
什么是绑核
所谓绑核,其实就是设定某个进程/线程与某个CPU核的亲和力(affinity)。
设定以后,Linux调度器就会让这个进程/线程只在所绑定的核上面去运行。但并不是说该进程/线程就独占这个CPU的核,其他的进程/线程还是可以在这个核上面运行的。
如果想要实现某个进程/线程独占某个核,就要使用cpuset命令去实现。
其实,很多情况下,为了提高性能,Linux调度器会自动实现尽量让某个进程/线程在同样的CPU上去运行。所以,除非必须,我们没有必要显式的去进行进程绑核操作(虚拟机中有时候需要这样做)。
绑核之前 ,在Linux内核启动的命令行加上"isolcpus="参数,可以实现CPU的隔离,使得在系统启动后普通进程默认都不会调度到被隔离的CPU上执行
例如,隔离了cpu2和cpu3的grub的配置文件如下:

ps -efL psr|grep 0
ps -efL psr|grep 1
ps -efL psr|grep 2
ps -efL psr|grep 3
查看隔离是否成功,如果隔离成功过,2和3两个核上仅有如下几个进程:
- migration进程(用于进程在不同CPU间迁移)
- 两个kworker进程(用于处理workqueues)
- ksoftirqd进程(用于调度CPU软中断的进程)
这些进程都是内核对各个CPU的一些守护进程,没有其他的普通进程在cup2和cpu3上运行,说明对它们的隔离是生效的
然后在宿主机中进行如下操作
如何绑核
taskset用于将某个进程/线程绑定到CPU的某个或某几个核上面,其用法如下:
taskset -p PID #查出进程pid现在的绑核情况。
设置绑核有两种方法:
掩码形式
列表形式
注意:下面的绑核实际绑定的逻辑cpu,按照逻辑cpu的id进行绑定(启用超线程时一定要注意)!!!!!
1、掩码形式绑核
将掩码转换为二进制形式,从最低位到最高位代表物理CPU的#0、#1、……、#n号核。某位的值为0表示不绑该核,1表示绑。
比如:
0x00000001的二进制为0000...0001,只有第0号核的位置是1,所以表示只绑0号核;
0x00000003的二进制为0000...0011,第0和1号核的位置是1,所以表示绑CPU的0号和1号核;
0xFFFFFFFF的二进制为1111...1111,所有32个核的位置都为1,所以表示绑CPU的0~31核。
需要注意的是,并非掩码中给出的CPU核就一定会存在,比如0x00000400(二进制为100 0000 0000)理论上代表CPU的第10号核,
但是该核在真正的计算机上面并不一定是存在的。而且,如果我们试图将物理上并不存的核绑定给某个进程时,会返回错误。
掩码形式的绑核命令为:
taskset -p MASK PID #mask要使用带0x前缀的16进制数
2、列表形式
列表形式指直接指定要绑的CPU核的列表,列表中可以有一个或多个核。
具体语法如下:
taskset -cp cpu-list PID #cpu-list是数字化的cpu列表,从0开始。多个不连续的cpu可用逗号连接,连续的可用短现连接,比如0,2,5-11等。
比如:
taskset -cp 0,2,5-11 10258 #将进程10258绑定到#0、#2、#5~#11号核上面
注意:只要taskset成功返回了,那就表示绑核一定成功了,即该进程已被绑到指定的核上面,而且taskset命令会显示原来的绑核(原来的可能是系统默认分配的核)情况,以及新的绑核情况。
linux中进程亲和性绑定的更多相关文章
- linux中进程控制
1.进程标识 每个进程都有一个非负整型表示的唯一的进程ID.进程ID标识符总是唯一的. 虽然进程ID是唯一的,但某个ID被回收后,ID号是可以复用的. ID为0的进程通常是调度进程(其常常被称交换进 ...
- [转]Linux中进程内存与cgroup内存的统计
From: http://hustcat.github.io/about/ Linux中进程内存与cgroup内存的统计 在Linux内核,对于进程的内存使用与Cgroup的内存使用统计有一些相同和不 ...
- Linux中CPU亲和性(affinity)
0.准备知识 超线程技术(Hyper-Threading):就是利用特殊的硬件指令,把两个逻辑内核(CPU core)模拟成两个物理芯片, 让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和 ...
- Linux中进程的优先级
Linux採用两种不同的优先级范围,一种是nice值.还有一种是实时优先级. 1.nice值 nice值得范围是-20~19,默认值是0. 越大的nice值意味着更低的优先级.也就是说nice值为-2 ...
- Linux中进程控制块PCB-------task_struct结构体结构
Linux中task_struct用来控制管理进程,结构如下: struct task_struct { //说明了该进程是否可以执行,还是可中断等信息 volatile long state; // ...
- 『学了就忘』Linux系统管理 — 82、Linux中进程的查看(ps命令)
目录 1.ps命令介绍 2.ps aux命令示例 3.ps -le命令示例 4.pstree命令 1.ps命令介绍 ps命令是用来静态显示系统中进程的命令. 不过这个命令有些特殊,它部分命令的选项前不 ...
- 『学了就忘』Linux系统管理 — 83、Linux中进程的查看(top命令)
目录 1.top命令介绍 2.top命令示例 3.top命令输出项解释 4.top命令常用的实例 1.top命令介绍 top命令是用来动态显示系统中进程的命令. [root@localhost ~]# ...
- Linux 中进程的管理
Linux 的进程信号 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能终止 17 STOP 无条件终止运 ...
- Linux中进程与线程的概念以及区别
linux进程与线程的区别,早已成为IT界经常讨论但热度不减的话题.无论你是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.对于一般的程序员,搞清楚二者的概念并在工作中学会运用是 ...
随机推荐
- Execution failed for task ':app:installDebug'.
解决方案:重新起服务(react-native start),重新起项目(react-native run-android)
- bzoj2825:[AHOI2012]收集资源
传送门 看到数据范围这么小,就没想过暴力的办法么 考虑肯定是从近走到远,所以走的点之间一定没有其他的点,所以我们就可以暴力的建图,然后暴力的去dfs就好了 代码: #include<cstdio ...
- 黑马tomact学习二 tomcat的启动
- IOS蓝牙连接 初步简单封装使用
最近写一个蓝牙项目 初步实现一下蓝牙设备连接交互,后期继续完善.... 1.连接蓝牙相关操作 BlueToothManger.h // // BlueToothManger.h // SmartRob ...
- Codeforces Round #547 (Div. 3) A.Game 23
链接:https://codeforces.com/contest/1141/problem/A 题意: 给n和m,有两种操作:将n×2 或 n×3,求最少的乘法次数由n得到m. 不能得到时为-1. ...
- O(nlogn)求逆序数对的个数
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...
- JDBC事务之例子篇
上一篇随笔记了一些有关JDBC事务管理的理论知识.这篇来看例子(主要怕一篇随笔装所有东西太长了然后分开呵呵) 一般讲事务管理的,都是拿转钱来当例子的,嗯没错我们这也是. 这个是数据库中的t_accou ...
- springmvc整合elasticsearch
网上大多时关于springboot整合的,也有spring的,但是 坑太多,都没法愉快的玩耍 这篇让我整合成功 https://www.cnblogs.com/sunny1009/articles/7 ...
- PM2常用命令
安装pm2 npm install -g pm2 1.启动 pm2 start app.js pm2 start app.js --name my-api #my-api为PM2进程名称 pm2 ...
- MVC dropdownlist 后端设置select属性后前端依然不能默认选中的解决方法
-----------------------------------来自网上的解决方法--------------------------------------------- ASP.Net MV ...