内存配置与 SQL Server 冲突

Microsoft.SQLServer.2016.AnalysisServices.UnitMonitor.Instance.ConfigurationConflictWithSQLServer (UnitMonitor)

如果 SQL Server 关系数据库引擎进程在服务器上运行,且 SSAS 实例的“总内存限制”配置高于指定阈值,监视器将发出警报,以确保 SQL Server 进程有足够的内存。

Knowledge Base article:

摘要

应相应调整 SQL Server Analysis Services“总内存限制”配置设置,以适合计算机上针对其他进程的内存分配。

原因

SQL Server 关系数据库引擎特别是在同时运行 SSAS 的计算机上可以占用内存资源的常见进程的主要示例,且在此情况下,可能会导致同一固定资源的两个大量使用者竞争物理内存。这要求两个数据库服务可以配置为共享足够的物理内存以执行必需的功能。如果 SSAS“总内存限制”配置过高,则 SSAS 可能会占用过多的内存,由于与关系数据库引擎(或事实上也占用较多内存的其他进程)竞争从而导致物理内存耗尽。“总内存限制”应配置为足够低以允许 SQL Server 的配置内存占用加上操作系统和计算机上必需的其他典型进程内存占用的备用量。

解决方法

内存配置发生冲突时,管理员必须考虑用户和其他进程的资源和需求,并相应调整所有相关进程的配置。Microsoft 数据库服务器上此类问题最常见的情况源自 SSAS 实例和 SQL Server 关系数据库引擎。幸运的是,两种服务都提供可以根据需要进行调整的功能配置设置。SSAS 没有通用的“总内存限制”设置,SQL 关系数据库引擎也没有通用的内存上限设置,因此管理员可以调整此警报的阈值以考虑各种具体的环境。发生问题时,可以采用以下任一种方法来缓解这种状况:

外部

Memory configuration and sizing considerations in SQL Server 2016(SQL Server 2016 中的内存配置和调整大小考虑事项)

针对 Analysis Services 内存属性的 TechNet 文档

在 Analysis Services 中配置服务器属性

针对 SSAS 性能计数器的 TechNet 文档

SSAS 多维性能指南

可替代参数

名称

说明

默认值

已启用

启用或禁用工作流

生成警报

定义工作流是否生成警报

间隔(秒)

运行工作流的重复间隔时间(秒)。

604800

同步时间

使用 24 小时格式指定的同步时间。可以忽略。

 

警告阈值 (%)

如果 SQL Server 关系数据库引擎进程在服务器上运行,且 SSAS 实例的“总内存限制”配置设置超过阈值,运行状况将发生更改。

40

超时(秒)

指定允许工作流在被关闭并标记为失败之前运行的时间。

300

Element properties:

TargetMicrosoft.SQLServer.2016.AnalysisServices.Instance
Parent MonitorSystem.Health.ConfigurationState
CategoryConfigurationHealth
EnabledTrue
Alert GenerateTrue
Alert SeverityWarning
Alert PriorityNormal
Alert Auto ResolveTrue
Monitor TypeMicrosoft.SQLServer.2016.AnalysisServices.MonitorType.Instance.ConfigurationConflictWithSQLServer
RemotableTrue
AccessibilityPublic
Alert Message
SSAS 2016: 内存配置与 SQL Server 冲突
SQL Server Analysis Services 实例“总内存限制”配置设置({0} GB)将为操作系统和 SQL Server 保留 {2} GB 中的 {1} GB,该值低于警报的配置阈值。
服务器上的总内存: {2} GB
内存总使用率: {5} GB
非 SSAS 进程使用的内存: {4} GB
SSAS 使用的内存: {3} GB
SSAS 内存下限: {6} GB ({7}\%)
SSAS 内存上限: {0} GB ({8}\%)
RunAsDefault

Source Code:

<UnitMonitor ID="Microsoft.SQLServer.2016.AnalysisServices.UnitMonitor.Instance.ConfigurationConflictWithSQLServer" Accessibility="Public" Enabled="true" Target="SQLAS!Microsoft.SQLServer.2016.AnalysisServices.Instance" ParentMonitorID="SystemHealth!System.Health.ConfigurationState" Remotable="true" Priority="Normal" TypeID="Microsoft.SQLServer.2016.AnalysisServices.MonitorType.Instance.ConfigurationConflictWithSQLServer" ConfirmDelivery="false">
<Category>ConfigurationHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.2016.AnalysisServices.UnitMonitor.Instance.ConfigurationConflictWithSQLServer.AlertMessage">
<AlertOnState>Warning</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>Warning</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Data/Context/Property[@Name='MemoryLimitHighGB']$</AlertParameter1>
<AlertParameter2>$Data/Context/Property[@Name='MemoryLeavesForOsGB']$</AlertParameter2>
<AlertParameter3>$Data/Context/Property[@Name='TotalPhysicalMemoryGB']$</AlertParameter3>
<AlertParameter4>$Data/Context/Property[@Name='MemoryUsageGB']$</AlertParameter4>
<AlertParameter5>$Data/Context/Property[@Name='MemoryUsageByOtherProcessGB']$</AlertParameter5>
<AlertParameter6>$Data/Context/Property[@Name='UsedPhysicalMemoryGB']$</AlertParameter6>
<AlertParameter7>$Data/Context/Property[@Name='MemoryLimitLowGB']$</AlertParameter7>
<AlertParameter8>$Data/Context/Property[@Name='MemoryLimitLowPercent']$</AlertParameter8>
<AlertParameter9>$Data/Context/Property[@Name='MemoryLimitHighPercent']$</AlertParameter9>
</AlertParameters>
</AlertSettings>
<OperationalStates>
<OperationalState ID="Warning" MonitorTypeStateID="ConfigurationConflict" HealthState="Warning"/>
<OperationalState ID="Success" MonitorTypeStateID="NoConfigurationConflict" HealthState="Success"/>
</OperationalStates>
<Configuration>
<Threshold>40</Threshold>
<IntervalSeconds>604800</IntervalSeconds>
<SyncTime/>
<TimeoutSeconds>300</TimeoutSeconds>
</Configuration>
</UnitMonitor>