SQLServer限制特定数据库的CPU使用率,确保关键业务系统有足够的资源

1、背景

因历史遗留的问题,操作系统是Win Server2012,数据库版本SQLserver2012,示例下有好几个数据库。但是某个数据库在特定程序执行的时间点,就会打满这个服务器的CPU

2、方案使用 Resource Governor 限制数据库 CPU 使用率(推荐)

2.1、启用 Resource Governor

sql 复制代码
-- 完整的配置脚本
USE master;
GO
-- 检查 Resource Governor 状态
SELECT 
    name,
    state_desc,
    max_cpu_percent,
    min_cpu_percent
FROM sys.resource_governor_configuration;

-- 如果未启用,先启用
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO

2.2、创建资源池(限制 CPU)

sql 复制代码
-- 创建受限的资源池
CREATE RESOURCE POOL LimitedCPUPool
WITH (
    MIN_CPU_PERCENT = 5,      -- 最小 CPU 保证 5%
    MAX_CPU_PERCENT = 20,     -- 最大 CPU 使用 20%
    CAP_CPU_PERCENT = 25      -- CPU 上限硬限制 25%
);
GO

-- 如果需要多个限制级别,可以创建多个资源池
CREATE RESOURCE POOL VeryLimitedCPUPool
WITH (
    MIN_CPU_PERCENT = 2,
    MAX_CPU_PERCENT = 10,
    CAP_CPU_PERCENT = 15
);
GO

2.3、创建工作负载组

sql 复制代码
-- 创建工作负载组关联到资源池
CREATE WORKLOAD GROUP LimitedCPUGroup USING LimitedCPUPool;
GO

CREATE WORKLOAD GROUP VeryLimitedCPUGroup USING VeryLimitedCPUPool;
GO

2.4、创建分类器函数

sql 复制代码
USE master;
GO

-- 创建分类器函数,根据数据库名分配工作负载组
CREATE FUNCTION dbo.DatabaseCPUClassifier()
RETURNS SYSNAME
WITH SCHEMABINDING
AS
BEGIN
    DECLARE @WorkloadGroup SYSNAME;
    DECLARE @DatabaseName SYSNAME;
    
    -- 获取当前数据库名
    SET @DatabaseName = ORIGINAL_DB_NAME();
    
    -- 根据数据库名分配不同的工作负载组
    IF @DatabaseName IN ('YourTargetDatabase', 'TestDB')
        SET @WorkloadGroup = 'LimitedCPUGroup';
    ELSE IF @DatabaseName IN ('ArchiveDB', 'OldDB')
        SET @WorkloadGroup = 'VeryLimitedCPUGroup';
    ELSE
        SET @WorkloadGroup = 'default';
    
    RETURN @WorkloadGroup;
END;
GO

-- 应用分类器函数
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.DatabaseCPUClassifier);
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO

2.5、验证配置

sql 复制代码
-- 查看资源池配置
SELECT 
    pool_id,
    name,
    min_cpu_percent,
    max_cpu_percent,
    cap_cpu_percent,
    used_cpu_percentage
FROM sys.dm_resource_governor_resource_pools;

-- 查看工作负载组
SELECT 
    group_id,
    name,
    pool_id,
    importance,
    request_max_cpu_cost_percent
FROM sys.dm_resource_governor_workload_groups;

-- 查看分类器函数
SELECT  name, definition FROM sys.objects
WHERE type = 'FN' AND name = 'DatabaseCPUClassifier';

-- 查看当前活动的会话和它们的工作负载组
SELECT 
    s.session_id,
    s.login_name,
    DB_NAME(s.database_id) AS DatabaseName,
    wg.name AS WorkloadGroup,
    rp.name AS ResourcePool,
    s.cpu_time,
    s.memory_usage
FROM sys.dm_exec_sessions s
LEFT JOIN sys.dm_resource_governor_workload_groups wg ON s.group_id = wg.group_id
LEFT JOIN sys.dm_resource_governor_resource_pools rp ON wg.pool_id = rp.pool_id
WHERE s.is_user_process = 1
ORDER BY s.cpu_time DESC;

2.6、效果图展示

3、注意事项

  • Resource Governor 只影响新连接的会话,已存在的连接需要重新连接才能生效
  • 测试环境先行:在生产环境部署前,务必在测试环境验证
  • 监控影响:配置后持续监控性能和资源使用情况
  • 逐步调整:CPU 限制百分比应该逐步调整,避免影响业务
  • SQL Server 版本:Resource Governor 在 Standard 和 Enterprise 版本中功能有所不同
相关推荐
这个DBA有点耶25 分钟前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风26 分钟前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Alluxio1 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
数据库急诊室_阿哲5 小时前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
青瓦梦滋6 小时前
Redis主从复制
服务器·数据库·redis·缓存·bootstrap
慧都小妮子6 小时前
Wyn商业智能国产数据库适配:数据接入、分析缓存与审计日志验证清单
数据库·数据分析·数据可视化·审计日志·商业智能
Joy T7 小时前
Redis Lua 原子限流:Lua 脚本、竞态条件与并发控制
数据库·redis·lua·限流·竞态条件·redis scripting
杨凯凡8 小时前
MySQL 死锁怎么排查?InnoDB 锁等待与 Spring Boot 整事务重试实战
数据库·spring boot·mysql
Aloudata8 小时前
Claude 做数据分析的这两年:一份复盘与发展线索
大数据·数据库·人工智能·数据挖掘·数据分析·dataagent
Decay__8 小时前
01_SQLServer 体系架构全解 —— 实例进程、关系引擎、SQLOS 与事务日志深入
运维·数据库·sql·mysql·架构