我有一台运行 SQL Server 实例的物理服务器。
我注意到这个服务器经常以 100% 的 CPU 使用率运行。
我的 IT 团队对此并不满意,并建议我们为操作系统保留 32 个内核中的 2 个。
这很好用,现在最大使用峰值略低于 90%。此外,不再报告来自不同用户的缓慢数据检索。
是否有任何理由不以这种方式使用 WSRM(Windows 系统资源管理器)而不是 SQL 资源调控器?
我们有一个 SQL Server 2008R2 标准版,其中包含多个数据库,这些数据库属于 16 核服务器上的不同应用程序。
最近推出的一个应用程序会定期执行昂贵的查询,导致 CPU 使用率达到 100%。当然,其他应用程序正在报告性能问题。
资源调控器似乎是控制流氓应用程序的合适工具,不幸的是它仅在企业版中可用。
由于其他应用程序相当简单,我试图通过降低实例的“最大并行度”来控制问题,以便单个查询无法降低所有内容。虽然这成功地将 CPU 负载保持在 50%,但出人意料地没有阻止其他应用程序陷入困境。
现在我们已决定将新应用程序的数据库移动到一个专用实例,但此实例的最佳配置是什么?我应该保留 MAXDOP 设置,使用 CPU 亲和掩码还是有其他选项来限制我不知道的 CPU 使用率?
在过去的一年中,我们遇到了许多不同的查询同时失败并出现以下错误(或不同资源调控器组中的变体)的情况:资源池“默认”中的系统内存不足,无法运行此错误询问。
最近我们越来越频繁地遇到它。关于导致问题的原因以及如何解决的任何想法?
@@version 返回:
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 2015 年 10 月 20 日 15:36:27 版权所有 (c) Microsoft Corporation 企业版:Windows NT 6.1(内部版本 7601)上的基于核心的许可(64 位) : 服务包 1)
全部同时发生的示例错误:
Error: 701, Severity: 17, State: 54.
There is insufficient system memory in resource pool 'default' to run this query.
Error: 701, Severity: 17, State: 123.
There is insufficient system memory in resource pool 'dm' to run this query.
Error: 701, Severity: 17, State: 89.
There is insufficient …Run Code Online (Sandbox Code Playgroud) 我在 SQL 2012 SP1 (ent) 上有一个并行查询,它在用户定义的资源调控器池中运行的速度比在用户定义的池中运行的慢得多(2 秒与 125 到 140 秒在用户定义的池中 = ~ 75 倍慢)比在其中运行的相同查询默认资源池。
两次执行之间的查询计划哈希是相同的,并且统计 io 为所有操作返回相同的值。我已经确认执行计划没有额外的溢出警告(两者都有一个),并且查询的内存授予是相同的。
用户定义的池工作负载组
<QueryPlan DegreeOfParallelism="4" MemoryGrant="2384096" CachedPlanSize="384" CompileTime="3608" CompileCPU="2712" CompileMemory="15672">
<ThreadStat Branches="5" UsedThreads="20">
<ThreadReservation NodeId="0" ReservedThreads="20" />
</ThreadStat>
<MemoryGrantInfo SerialRequiredMemory="5632" SerialDesiredMemory="2360768" RequiredMemory="28960" DesiredMemory="2384096" RequestedMemory="2384096" GrantWaitTime="0" GrantedMemory="2384096" MaxUsedMemory="93872" />
<OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="209715" EstimatedPagesCached="104857" EstimatedAvailableDegreeOfParallelism="4" />
Run Code Online (Sandbox Code Playgroud)
默认池
<QueryPlan DegreeOfParallelism="4" MemoryGrant="2384096" CachedPlanSize="384" CompileTime="3016" CompileCPU="2660" CompileMemory="15672">
<ThreadStat Branches="5" UsedThreads="20">
<ThreadReservation NodeId="0" ReservedThreads="20" />
</ThreadStat>
<MemoryGrantInfo SerialRequiredMemory="5632" SerialDesiredMemory="2360768" RequiredMemory="28960" DesiredMemory="2384096" RequestedMemory="2384096" GrantWaitTime="0" GrantedMemory="2384096" MaxUsedMemory="88768" />
<OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="209715" EstimatedPagesCached="104857" EstimatedAvailableDegreeOfParallelism="4" /> …Run Code Online (Sandbox Code Playgroud) 我有几个大表需要复制到事务数据库上的分区副本中。
我担心这会对我的生产应用程序的性能造成影响。
为了缓解这种情况,我正在研究资源调控器。我将设置我的脚本以使用限制为最多 5% CPU 和内存的资源池。
关于这一点,我不确定的唯一部分是对 PLE 的影响。
据我了解,表中的选择会将值读入缓存。这将强制排除缓存中的其他内容。(PLE 的基本概念。)但是“强制退出”的项目会被限制在我指定的 5% 之内吗?
意思是在我使用了 5% 的内存后,它是否只会强制排除相同 5% 中的缓存项目?(其他 95% 不受影响。)
另一种提问方式是:5% 的内存限制是否与 5% 的缓存限制相同?
sql-server sql-server-2012 resource-governor page-life-expectancy
禁用资源调控器后是否应该重新启动 SQL Server?最佳做法是什么?
为什么我问这个,因为我担心 SQL Server 中现有的打开会话。如果我们只禁用资源调控器而不重新启动 SQL 服务,它们的行为(在 CPU、内存和 IO 方面)是否会更改为默认值?
例如,如果某个特定会话由于资源调控器而被限制为使用系统总内存的 30%。所以如果我们现在单独禁用资源调控器,它会立即开始使用超过 30% 吗?
我正在尝试设置资源调控器,以限制使用 SQL 代理作业运行的进程的 IOPS。分类器函数设置为标识特定登录(使用该登录运行的任何 spid 都应使用分配给它的资源组)。然后我EXECUTE AS LOGIN = 'ResourceGovernerUser'在作业中添加,但我无法让它工作并且它回退到默认池,因为作业是'EXECUTED AS 'ServiceAccount''. 尽管如果我使用 来查看活动进程sp_WhoisActive,登录名会显示为'ResourceGovernerUser'而不是服务帐户。所以我修改了分类器函数以使用服务帐户,然后它就可以工作了。我使用 perfmon 计数器'Disk Read IO/Sec'和对象'Disk Write IO/Sec'下验证了这一点'Resource Pool Stats'。
问题是 - 如何让资源调控器使用服务帐户以外的登录名(与代理作业一起使用时)?我确实有一些未经测试的丑陋想法,例如 - 使用 CmdExec 或 PowerShell 代理运行作业。如果有人遇到过类似的情况或有更好的想法,我将不胜感激。谢谢你。
--Example Setup:
USE [master]
GO
CREATE RESOURCE POOL [SqlJobPool] WITH(
min_iops_per_volume=1,
max_iops_per_volume=5000);
GO
CREATE WORKLOAD GROUP [IOGroup]
USING [SqlJobPool];
GO
CREATE FUNCTION [dbo].[fn_LimitedIO]()
RETURNS SYSNAME WITH SCHEMABINDING
AS
BEGIN
DECLARE @grp SYSNAME;
IF SUSER_NAME() = …Run Code Online (Sandbox Code Playgroud) 我们有一个来自应用程序团队的 AD-HOC 流程,该流程从我们在 SQLserver 中频繁使用的 OLTP 数据库之一获取数据,以将数据迁移到 MongoDB。
在性能测量期间,我们可以看到,当从这个 sql server 获取数据时,他们运行的那部分 CPU 峰值出现了将近一个小时,几乎达到 60-80%。
因此,为了减少这种影响,我们正在考虑使用资源调控器来限制 CPU/内存资源。我从未使用过 RG,但阅读博客似乎是理想的选择。
请建议是否可以实现这一点,或者根据您的经验提出更好的建议。
上述活动是每月一次在 SQL Server 2008R2 中的 5 TB 数据库上获取约 8000 万条数据
有没有一种方法可以识别执行查询时实际消耗大量资源的顶级数据库用户?
在 SQL Server 2016 数据库服务器上,我几乎没有查询非常慢并且需要更多内存(查询未优化)。这使得整个数据库变慢,因为许多用户正在运行相同的查询。这导致其他查询等待。我CXCONSUMER等待(由于并行执行)和RESOURCE_SEMAPHORE.
所以这造成了内存压力(我相信这些缓慢的查询正在为其他查询造成内存争用,进而造成内存压力),我认为这导致我的计划缓存以固定的时间间隔清除。
我读到默认情况下Memory Grant %为 25%。我正在考虑增加这 25% 来为查询提供内存。我现在正在尝试暂时解决这个问题。
未优化的查询是 LINQ 查询,更改将需要团队一些时间。
所以请建议在资源调控器中增加Memory Grant %是否是一个好主意?
我总共有 128GB RAM,其中 75% (102 GB) 分配给 SQL Server。
我有一个远程 MS SQL Server,我有几种类型的查询。
我运行了一些属于低延迟生产应用程序一部分的查询,并且需要确保它们及时停止。
但我也有“研究”查询,这些查询往往占用大量 CPU。
如何设置分类器,以便不同的查询(来自同一用户)使用不同的资源池运行,以便我的研究查询不会占用所有 CPU?
我被困在如何做到这一点上,因为我无法按用户区分。