SQL Server on Linux 在多 NUMA 架构下,未能正确识别或绑定 CPU

SQL Server 启动日志,已经透露出 NUMA 和 CPU 使用异常的明显信号,我们可以据此进一步确认和解决。


✅ 核心问题定位

从日志中最关键的一段是:

Node configuration: node 4: CPU mask: 0x0000000000555555:1 Active CPU mask: 0x0000000000000000:1.
Node configuration: node 5: CPU mask: 0x0000555555000000:1 Active CPU mask: 0x0000000000000000:1.
Node configuration: node 6: CPU mask: 0x0000000000aaaaaa:1 Active CPU mask: 0x0000000000000000:1.
Node configuration: node 7: CPU mask: 0x0000aaaaaa000000:1 Active CPU mask: 0x0000000000000000:1.

注意:这些节点的 Active CPU mask 都是 0x0000000000000000,意味着
➤ SQL Server 在 NUMA Node 4~7 上发现 CPU,但没有启用任何核心,等于不能调度任务


🎯 问题核心:SQL Server on Linux 在多 NUMA 架构下,未能正确识别或绑定 CPU

这通常发生于:

  1. 容器被 cgroup 限制了 CPU 核心(比如 cpuset-cpus 限定了一部分核心);
  2. Kubernetes 中设置了 CPU 请求/上限,但未正确映射到 SQLPAL 内核层
  3. 系统 NUMA 配置异常,导致 CPU mask 在 MSSQL 中不可用;
  4. 部分核心为“isolated”或关闭(如 BIOS 设置),系统层可见但 MSSQL 无法使用。

✅ 诊断与修复建议

🔍 1. 确认当前系统可用 NUMA 配置

numactl --hardware

查看结果类似:

available: 4 nodes (0-3)
node 0 cpus: 0 1 2 3 4 5
node 1 cpus: 6 7 8 9 10 11
...

如果你看到 Node 4~7,是不是被 BIOS 设置成了一种 dummy NUMA 节点(如 Intel Sub-NUMA Clustering)?


🔍 2. 查看容器内是否绑定了 CPU 核心

cat /sys/fs/cgroup/cpuset/cpuset.cpus

如果这里限制了 MSSQL 容器只能用部分 CPU(例如 0-3),那就会导致其他 NUMA 节点的 CPU 不可用。


✅ 解决方式一:显式绑定 MSSQL 到一个正常的 NUMA Node

你可以用 numactl 来强制绑定:

numactl --cpunodebind=0 --membind=0 /opt/mssql/bin/sqlservr

这会强制 SQL Server 使用 NUMA Node 0 的 CPU 和内存。


✅ 解决方式二:调整容器配置,释放 NUMA mask 绑定限制

如果你用 Docker:

确保没有使用 --cpuset-cpus="x-y" 限制 CPU,同时放宽限制:

docker run --memory="16g" --cpus="8" ... mssql
如果你用 Kubernetes:

调整容器的资源限制为:

resources:
  requests:
    cpu: "4"
    memory: "8Gi"
  limits:
    cpu: "8"
    memory: "16Gi"

✅ 解决方式三(长期建议):在 MSSQL 配置文件中禁用 NUMA 自动分配

编辑或新增配置 /var/opt/mssql/mssql.conf

[fabric]
numa_optimized = false

然后重启 SQL Server:

systemctl restart mssql-server

这个设置可能在某些版本中不生效,但对 NUMA 兼容性较差的平台会有帮助。


🔧 附加建议:强烈推荐为 NUMA 问题添加启动诊断日志级别

临时加启动参数:

/opt/mssql/bin/sqlservr -m -d -T845

其中 -T845 是启用 NUMA 分区/分配的跟踪标志。


✅ 总结

检查项当前情况建议
NUMA Node多个 node(4~7),但 Active CPU mask 为 0➤ 错误或无效 NUMA 绑定
cgroup 限制可能限制了 CPU➤ 检查 cpuset 和 limits
修复方式numactl 强制绑定,调整容器资源限制✅ 推荐
MSSQL 配置可以尝试禁用 NUMA 优化可做为兼容方案

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值