鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

使用说明

建议关注MySQL官网MySQL 8.0.20版本的CVE漏洞,按照要求及时进行漏洞修复。

版本说明

本特性随Kunpeng BoostKit 21.0.0版本和Kunpeng BoostKit 22.0.0版本发布,分别对应MySQL 8.0.20和MySQL 8.0.25。

应用场景

当OLTP负载中存在较多写类型操作时(update/insert/delete),会产生较多redo log写请求,MySQL后台的写log线程可能压力过大,影响系统吞吐量。如果通过InnoDB Monitors的log_on_write_waits观测到日志线程繁忙,可通过本特性提高log线程效率,避免其成为系统瓶颈。此外,如果分析得出业务本身适合NUMA亲和,在NUMA架构的多路服务器上,可通过本特性提高用户线程的访存效率。

本特性在补丁应用后重新编译MySQL,还需额外配置系统变量才能生效。系统变量配置建议详见表3

使用限制

本特性依赖libnuma库。libnuma库不允许接口调用设置的CPU core(s)超出父进程启动时的绑核范围,否则视为有冲突。此外MySQL内调度器无法感知到从外部执行的改变绑核策略的行为。因此,使用本特性时需遵循如下实践:

  • MySQL实例启动时,如果同时在外部给MySQL设置绑核策略(如taskset、numactl),则用户配置的MySQL内调度器参数不能与其存在冲突。否则MySQL实例启动失败,输出相应错误日志。
  • MySQL实例运行时,如果用户要更改MySQL内调度器参数,则不能与MySQL进程启动时从外部设置的绑核策略冲突(如taskset、numactl)。否则MySQL实例将继续运行,但调度器将进入fallback模式,不再响应内部线程调度请求,输出相应告警日志。
  • MySQL实例启动后,不应该再从MySQL外部直接改变线程绑核策略。否则MySQL实例将继续运行,但调度器的负载信息不再准确,影响调度效果。

    如果查询SHOW STATUS LIKE 'Sched_affinity_group_number'返回值为-1,则表明特性未使能。

编译安装方法

MySQL NUMA调度优化特性以Patch补丁文件形式提供,该补丁基于MySQL 8.0.20和MySQL 8.0.25版本开发,并在Gitee社区开源,使用该特性前,需要先将Patch应用到MySQL源码中,再编译和安装MySQL。

  1. 参考表1下载MySQL源码,并上传至服务器“/home”目录。
  2. 参考表2下载MySQL NUMA调度优化特性Patch,并上传至MySQL源码的根目录。
  3. 可选:如果没有配置Yum源,请配置Yum源,详细信息请参见配置Yum源
  4. 该特性实现依赖libnuma,以CentOS为例,编译MySQL前,需安装如下依赖。
    1
    yum install -y numactl numactl-devel numactl-libs
    

    如果编译时未找到libnuma相关依赖,MySQL仍会正常编译,但本特性将无法生效。

  5. 以基于MySQL 8.0.20版本应用该特性为例,上传MySQL源码至“/home”目录下后,解压MySQL源码包并进入MySQL源码根目录。
    1
    2
    3
    cd /home
    tar -zxvf mysql-boost-8.0.20.tar.gz
    cd mysql-8.0.20
    
  6. 在源码根目录,使用git初始化命令来建立git管理信息。
    1
    2
    3
    git init
    git add -A
    git commit -m "Initial commit"
    
    • 一般情况下,系统自带git,若需要安装git,请先参见《MySQL 移植指南》中配置Yum源相关内容,再执行如下命令安装git。
      1
      yum install git
      
    • 若未配置git的提交用户信息,git commit前需要先配置用户邮件及用户名称信息。
      1
      2
      git config user.email "123@example.com"
      git config user.name "123"
      
  7. 可选:如果没有安装dos2unix,请执行如下命令安装dos2unix。
    1
    yum install dos2unix
    
  8. 合入NUMA调度优化特性补丁。
    1
    2
    3
    dos2unix 0001-SCHED-AFFINITY.patch
    git apply --check 0001-SCHED-AFFINITY.patch
    git apply --whitespace=nowarn 0001-SCHED-AFFINITY.patch
    

    本步骤以基于MySQL 8.0.20版本应用该特性为例,如需基于其他版本应用特性,请按照实际补丁的名称修改以上命令。

    如果没有回显报错信息,则补丁应用成功。

  9. 根据正常的编译安装MySQL源码的操作步骤进行MySQL的编译安装。详细信息请参见《MySQL 移植指南》。
  10. 在重新编译MySQL之后,还需额外在配置文件、启动参数或运行时配置系统变量才能生效。

    本特性增加如表3所示MySQL系统变量,可在配置文件、启动参数或运行时设置,请按需选择其中一种方式进行操作。

    表3 MySQL NUMA调度特性参数说明以及配置建议

    参数

    参数说明

    配置建议

    sched_affinity_numa_aware

    global级别参数,布尔类型,如果设置为ON且sched_affinity_foreground_thread不为空值,则sched_affinity_foreground_thread设置的CPU core(s)会根据numa node进行分组,而一个会话所在的线程只会在其中特定组中的core(s)间迁移。

    本参数运行时可更改,默认值是OFF。

    设置是否开启前台进程绑核。sched_affinity_foreground_thread不为空值时,则sched_affinity_foreground_thread设置的CPU core(s)会根据numa node进行分组,而一个会话所在的线程只会在其中特定组中的core(s)间迁移。建议配置为ON。

    sched_affinity_foreground_thread

    global级别参数,字符串类型,用于设置MySQL前台线程允许运行的CPU core(s) 。

    有效取值由代表core编号的数字组合成的字符串。core编号可通过逗号(,)分隔,可通过减号(-)表示范围。以下均为合法的CPU core(s)取值:

    • 空值
    • 5
    • 0,5,7
    • 0,2-5,7

    本参数在数据库运行时可更改,默认值是空值。当取值为空值,表示本类线程由操作系统调度,相当于未启用本参数。

    指定MySQL前台线程(用户线程)运行的CPU core。建议前台线程和后台线程绑在不同的core上。

    sched_affinity_log_writer

    global级别参数,字符串类型,用于设置MySQL log_writer线程允许运行的CPU core(s)。

    有效取值由代表core编号的数字组合成的字符串。core编号可通过逗号(,)分隔,可通过减号(-)表示范围。以下均为合法的CPU core(s)取值:

    • 空值
    • 5
    • 0,5,7
    • 0,2-5,7

    本参数在数据库运行时可更改,默认值是空值。当取值为空值,log_writer线程将恢复为由操作系统调度。

    设置MySQL log_writer线程允许运行的CPU core(s)。建议后台线程绑在同一个numa node的core上。

    sched_affinity_log_flusher

    global级别参数,字符串类型,用于设置MySQL log_flusher线程允许运行的CPU core(s)。

    有效取值由代表core编号的数字组合成的字符串。core编号可通过逗号(,)分隔,可通过减号(-)表示范围。以下均为合法的CPU core(s)取值:

    • 空值
    • 5
    • 0,5,7
    • 0,2-5,7

    本参数在数据库运行时可更改,默认值是空值。当取值为空值,log_flusher线程将恢复为由操作系统调度。

    设置MySQL log_flusher线程允许运行的CPU core(s) 。建议后台线程绑在同一个numa node的core上。

    sched_affinity_log_write_notifier

    global级别参数,字符串类型,用于设置MySQL log_write_notifier线程允许运行的CPU core(s) 。

    有效取值由代表core编号的数字组合成的字符串。core编号可通过逗号(,)分隔,可通过减号(-)表示范围。以下均为合法的CPU core(s)取值:

    • 空值
    • 5
    • 0,5,7
    • 0,2-5,7

    本参数运行时可更改,默认值是空值。当取值为空值,log_write_notifier线程将恢复为由操作系统调度。

    设置MySQL log_write_notifier线程允许运行的CPU core(s) 。建议后台线程绑在同一个numa node的core上。

    sched_affinity_log_flush_notifier

    global级别参数,字符串类型,设置MySQL log_flush_notifier线程允许运行的CPU core(s)。

    有效取值由代表core编号的数字组合成的字符串。core编号可通过逗号(,)分隔,可通过减号(-)表示范围。以下均为合法的CPU core(s)取值:

    • 空值
    • 5
    • 0,5,7
    • 0,2-5,7

    本参数运行时可更改,默认值是空值。当取值为空值,log_flush_notifier线程将恢复为由操作系统调度。

    设置MySQL log_flush_notifier线程允许运行的CPU core(s) 。建议后台线程绑在同一个numa node的core上。

    sched_affinity_log_checkpointer

    global级别参数,字符串类型,设置MySQL log_checkpointer线程允许运行的CPU core(s) 。

    有效取值由代表core编号的数字组合成的字符串。core编号可通过逗号(,)分隔,可通过减号(-)表示范围。以下均为合法的CPU core(s)取值:

    • 空值
    • 5
    • 0,5,7
    • 0,2-5,7

    本参数运行时可更改,默认值是空值。当取值为空值,log_checkpointer线程将恢复为由操作系统调度。

    设置MySQL log_checkpointer线程允许运行的CPU core(s) 。建议后台线程绑在同一个numa node的core上。

    sched_affinity_purge_coordinator

    global级别参数,字符串类型,设置MySQL purge_coordinator线程允许运行的CPU core(s) 。

    有效取值由代表core编号的数字组合成的字符串。core编号可通过逗号(,)分隔,可通过减号(-)表示范围。以下均为合法的CPU core(s)取值:

    • 空值
    • 5
    • 0,5,7
    • 0,2-5,7

    本参数运行时可更改,默认值是空值。当取值为空值,purge_coordinator线程将恢复为由操作系统调度。

    设置MySQL purge_coordinator线程允许运行的CPU core(s) 。建议后台线程绑在同一个numa node的core上。

    sched_affinity_log_closer

    global级别参数,字符串类型,设置MySQL log_closer线程允许运行的CPU core(s) 。

    有效取值由代表core编号的数字组合成的字符串。core编号可通过逗号(,)分隔,可通过减号(-)表示范围。以下均为合法的CPU core(s)取值:

    • 空值
    • 5
    • 0,5,7
    • 0,2-5,7

    本参数运行时可更改,默认值是空值。当取值为空值,log_closer线程将恢复为由操作系统调度。

    须知:

    MySQL 8.0.25中删除了log_closer线程,因此相应版本补丁中不提供该参数。

    设置MySQL log_closer线程允许运行的CPU core(s) 。建议后台线程绑在同一个numa node的core上。

    • 方式一:修改配置文件。此种方法需要重启数据库方可生效。
      1. 在配置文件中配置系统变量。示例:
        1
        2
        3
        4
        5
        6
        7
        8
        sched_affinity_numa_aware=ON
        sched_affinity_foreground_thread=0-29
        sched_affinity_log_writer=30
        sched_affinity_log_flusher=30
        sched_affinity_log_write_notifier=31
        sched_affinity_log_flush_notifier=31
        sched_affinity_log_checkpointer=31
        sched_affinity_purge_coordinator=31
        

        数据库的配置文件默认路径为“/etc/my.cnf”。也可以通过以下命令行指定defaults-file选项,其中“/tmp/myconfig.txt”表示指定配置文件的路径。

        1
        mysqld --defaults-file=/tmp/myconfig.txt
        
      2. 重启数据库。
    • 方式二:修改数据库的启动参数。
      1. 启动数据库时,在启动命令中增加系统变量的配置。此种方法需要重启数据库方可生效。示例:
        1
        2
        3
        4
        5
        6
        7
        8
        9
        mysqld --defaults-file=/etc/my.cnf \
        --sched_affinity_numa_aware=ON \
        --sched_affinity_foreground_thread=0-29 \
        --sched_affinity_log_writer=30 \
        --sched_affinity_log_flusher=30 \
        --sched_affinity_log_write_notifier=31 \
        --sched_affinity_log_flush_notifier=31 \
        --sched_affinity_log_checkpointer=31 \
        --sched_affinity_purge_coordinator=31
        
      2. 重启数据库。
    • 方式三:运行时连接数据库,通过SQL语句配置系统变量。此种方法不需要重启数据库即可生效。示例:
      1
      2
      3
      4
      5
      6
      7
      8
      set global sched_affinity_numa_aware=ON;
      set global sched_affinity_foreground_thread="0-29";
      set global sched_affinity_log_writer="30";
      set global sched_affinity_log_flusher="30";
      set global sched_affinity_log_write_notifier="31";
      set global sched_affinity_log_flush_notifier="31";
      set global sched_affinity_log_checkpointer="31";
      set global sched_affinity_purge_coordinator="31";
      
  11. 可选:查看MySQL状态变量。

    为支持查询调度管理器内部状态,本特性增加新增如表4所示的MySQL状态变量。

    表4 MySQL状态变量名称和说明

    状态变量名称

    说明

    Sched_affinity_status

    返回调度管理器中各个分组的负载情况。

    Sched_affinity_group_number

    返回系统NUMA node总数。

    Sched_affinity_group_capacity

    返回系统每个NUMA node中的Core数量。

    开启MySQL NUMA调度优化特性后,执行如下SQL语句即可查看MySQL状态变量的信息。

    1
    show status like "%状态变量名%";
    
  12. 可选:通过TPC-C测试可以得到使用MySQL NUMA调度优化特性前后的性能提升效果,详细测试步骤请参见《BenchMarkSQL 测试指导》。
    MySQL NUMA调度优化特性可以使TPC-C综合性能提升10%,优化前后对比效果如图1所示。
    图1 MySQL NUMA调度优化特性优化前后性能对比