使用说明
建议关注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下载MySQL源码,并上传至服务器“/home”目录。
- 参考表2下载MySQL NUMA调度优化特性Patch,并上传至MySQL源码的根目录。
- 可选:如果没有配置Yum源,请配置Yum源,详细信息请参见配置Yum源。
- 该特性实现依赖libnuma,以CentOS为例,编译MySQL前,需安装如下依赖。
1
yum install -y numactl numactl-devel numactl-libs
如果编译时未找到libnuma相关依赖,MySQL仍会正常编译,但本特性将无法生效。
- 以基于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
- 在源码根目录,使用git初始化命令来建立git管理信息。
1 2 3
git init git add -A git commit -m "Initial commit"
- 可选:如果没有安装dos2unix,请执行如下命令安装dos2unix。
1
yum install dos2unix
- 合入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版本应用该特性为例,如需基于其他版本应用特性,请按照实际补丁的名称修改以上命令。
如果没有回显报错信息,则补丁应用成功。
- 根据正常的编译安装MySQL源码的操作步骤进行MySQL的编译安装。详细信息请参见《MySQL 移植指南》。
- 在重新编译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 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
- 重启数据库。
- 在配置文件中配置系统变量。示例:
- 方式二:修改数据库的启动参数。
- 启动数据库时,在启动命令中增加系统变量的配置。此种方法需要重启数据库方可生效。示例:
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
- 重启数据库。
- 启动数据库时,在启动命令中增加系统变量的配置。此种方法需要重启数据库方可生效。示例:
- 方式三:运行时连接数据库,通过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";
- 可选:查看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 "%状态变量名%";
- 可选:通过TPC-C测试可以得到使用MySQL NUMA调度优化特性前后的性能提升效果,详细测试步骤请参见《BenchMarkSQL 测试指导》。MySQL NUMA调度优化特性可以使TPC-C综合性能提升10%,优化前后对比效果如图1所示。