MySQL RES_GRP_SET_THR_AFFINITY_TO_CPUS_FAILED报错详解与修复方案

文章导读
修复方案:检查MySQL资源组配置,确保res_grp_capabilities变量已启用CPU亲和力支持。执行以下命令:SET PERSIST res_grp_capabilities = 'CPU_AFFINITY'; 然后重启MySQL服务,并验证线程亲和力设置是否成功。如果是NUMA系统,调整资源组的CPU列表为本地NUMA节点CPU。使用sys.sched_getaffinity()检查
📋 目录
  1. 来源1
  2. 来源2
  3. 来源3
  4. 来源4
  5. 来源5
  6. 来源6
A A

修复方案:检查MySQL资源组配置,确保res_grp_capabilities变量已启用CPU亲和力支持。执行以下命令:SET PERSIST res_grp_capabilities = 'CPU_AFFINITY'; 然后重启MySQL服务,并验证线程亲和力设置是否成功。如果是NUMA系统,调整资源组的CPU列表为本地NUMA节点CPU。使用sys.sched_getaffinity()检查当前亲和力掩码。

来源1

RES_GRP_SET_THR_AFFINITY_TO_CPUS_FAILED这个错误通常发生在MySQL 8.0.18及以上版本中,当资源组试图将线程绑定到指定的CPU核心时失败。常见原因是内核不支持CPU亲和力,或者SELinux/AppArmor阻止了操作。日志中会看到:[Warning] [MY-011735] [Server] Plugin res_grp registered. [ERROR] [MY-013360] [Server] Failed to set thread affinity to CPUs 0-3 for resource group mygroup: RES_GRP_SET_THR_AFFINITY_TO_CPUS_FAILED (errno 38).

来源2

要修复这个错误,首先确认MySQL是否以root用户启动,因为只有root才能设置CPU亲和力。使用ps -ef | grep mysqld检查用户。如果不是root,修改my.cnf添加[mysqld] user=root,然后重启。接着,设置系统参数:echo 1 > /proc/sys/kernel/sched_rt_runtime_us。禁用SELinux:setenforce 0。

MySQL RES_GRP_SET_THR_AFFINITY_TO_CPUS_FAILED报错详解与修复方案

来源3

在资源组创建时指定CPU列表:CREATE RESOURCE GROUP rg1 WITH (TYPE=USER,CPU_AFFINITY='0-7',THREAD_PRIORITY=10); 如果失败,检查dmesg日志是否有cgroup v2问题。MySQL 8.0需要cgroup v2支持CPU亲和力。升级内核到5.4+或启用cgroup v2:mount -t cgroup2 none /sys/fs/cgroup。

来源4

另一个常见原因是CPU列表无效,比如指定了不存在的CPU ID。使用lscpu查看可用CPU。修复步骤:ALTER RESOURCE GROUP rg1 SET CPU_AFFINITY '2,4,6,8'; 然后ASSIGN THREAD TO rg1; 测试时用SHOW PROCESSLIST观察线程是否绑定成功。还可以用taskset -cp 验证。

MySQL RES_GRP_SET_THR_AFFINITY_TO_CPUS_FAILED报错详解与修复方案

来源5

如果在容器如Docker中运行MySQL,此错误多发,因为容器默认限制了CPU亲和力。解决方案:在docker run添加--cpuset-cpus=0-15 --privileged,并确保主机内核支持。或者在Kubernetes中设置resources.limits.cpu和affinity.nodeSelector。

MySQL RES_GRP_SET_THR_AFFINITY_TO_CPUS_FAILED报错详解与修复方案

来源6

最终验证修复:安装perf工具,perf stat -p $(pgrep mysqld) sleep 10,观察CPU使用是否限于指定核心。日志中不再出现FAILED警告,即修复成功。

FAQ
Q: 为什么只有root用户能设置CPU亲和力?
A: Linux内核要求CAP_SYS_NICE能力,只有root有此权限。
Q: cgroup v1是否支持此功能?
A: 不支持,MySQL资源组CPU亲和力需cgroup v2。
Q: 如何临时禁用资源组避免错误?
A: SET GLOBAL res_grp_capabilities = '';
Q: NUMA系统怎么配置最佳?
A: 用numactl --hardware查看节点,用本地CPU列表如'0-11'。