• 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两个核上仅有如下几个进程:

    1. migration进程(用于进程在不同CPU间迁移
    2. 两个kworker进程(用于处理workqueues)
    3. ksoftirqd进程(用于调度CPU软中断的进程

    这些进程都是内核对各个CPU的一些守护进程,没有其他的普通进程在cup2cpu3上运行,说明对它们的隔离是生效的

    然后在宿主机中进行如下操作

    如何绑核

    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命令会显示原来的绑核(原来的可能是系统默认分配的核)情况,以及新的绑核情况。

  • 相关阅读:
    oralce 11g data guard
    oracle的锁与并发机制
    10 个MySQL数据库备份教程推荐
    Linux环境下用exp备份Oracle数据表并导入的脚本
    使用Oracle 10g的Logminer挖掘日志
    ORACLE查询表最近更改的数据
    如何监控oracle的索引是否使用
    看 淡 一切 生 命 只 是 个 过 程
    Java数组声明、创建、初始化
    Linux建立FTP的方法
  • 原文地址:https://www.cnblogs.com/wyzhou/p/9292708.html
Copyright © 2020-2023  润新知