The monitor reports a critical state and raises an alert when the amount of memory used by the resource pool is greater than the Threshold setting, expressed as a percentage of memory available for Memory-Optimized Data tables for the given resource pool.
The monitor reports a critical state and raises an alert when the amount of memory used by the resource pool is greater than the Threshold setting, expressed as a percentage of memory available for Memory-Optimized Data tables for the given resource pool.
The named resource pool when mapped to memory-optimized database tracks memory allocated to all memory-optimized tables, including internal tables that are used for various structures within Memory-Optimized Data engine.
SQL Server Memory-Optimized Data uses more memory and in different ways than SQL Server does. It is possible that the amount of memory you installed and allocated for Memory-Optimized Data becomes inadequate for your growing needs. If so, you could run out of memory.
Please refer to this article for more details: Bind a Database with Memory-Optimized Tables to a Resource Pool.
To resolve your Low Memory or Out Of Memory condition you need to either free up existing memory by reducing usage, or make more memory available to your Memory-Optimized data tables. Possible corrective actions may include:
Check if there are long running transaction that is preventing garbage collection of memory. If yes, consider killing the long running transaction and/or look into the design of the application to see if you can reduce the duration of the transactions.
Free up existing memory.
Delete non-essential Memory-Optimized table rows and wait for garbage collection.
Move one or more rows to a disk-based table.
Increase value of MAX_MEMORY_PERCENT on the resource pool.
Increase memory available to SQL Server Instance by configuring the Max Server Memory to a higher value.
Install additional memory.
How to Manage your Memory for Memory-Optimized Data
Name | Description | Default Value |
Alert Priority | Defines Alert Priority. | Normal |
Alert Severity | Defines Alert Severity. | Error |
Enabled | Enables or disables the workflow. | Yes |
Generates Alerts | Defines whether the workflow generates an Alert. | Yes |
Interval (seconds) | The recurring interval of time in seconds in which to run the workflow. | 300 |
Number of samples | Indicates how many times a measured value should breach a threshold before the state is changed. | 6 |
Script Delay (milliseconds) | This parameter sets the delay between consecutive T-SQL queries executed by the workflow. This may help to reduce the footprint generated by the workflow in case of large number of target objects. Please advise with Microsoft Support before changing this parameter. | 0 |
Synchronization Time | The synchronization time specified by using a 24-hour format. May be omitted. | 00:07 |
Threshold | The collected value will be compared against this parameter. | 90 |
Timeout (seconds) | Specifies the time the workflow is allowed to run before being closed and marked as failed. | 180 |
Target | Microsoft.SQLServer.2016.UserResourcePool | ||
Parent Monitor | System.Health.PerformanceState | ||
Category | PerformanceHealth | ||
Enabled | True | ||
Alert Generate | True | ||
Alert Severity | Error | ||
Alert Priority | Normal | ||
Alert Auto Resolve | True | ||
Monitor Type | Microsoft.SQLServer.2016.MonitorType.UserResourcePool.MemoryConsumption | ||
Remotable | True | ||
Accessibility | Public | ||
Alert Message |
| ||
RunAs | Default |
<UnitMonitor ID="Microsoft.SQLServer.2016.Monitor.UserResourcePool.MemoryConsumption" Target="SQL2016Core!Microsoft.SQLServer.2016.UserResourcePool" ParentMonitorID="SystemHealth!System.Health.PerformanceState" TypeID="Microsoft.SQLServer.2016.MonitorType.UserResourcePool.MemoryConsumption" Accessibility="Public" Enabled="true" Remotable="true" Priority="Normal" ConfirmDelivery="true">
<Category>PerformanceHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.2016.Monitor.UserResourcePool.MemoryConsumption.AlertMessage">
<AlertOnState>Error</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>Error</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.ResourcePool"]/Name$</AlertParameter1>
</AlertParameters>
</AlertSettings>
<OperationalStates>
<OperationalState ID="ErrorState" MonitorTypeStateID="ErrorState" HealthState="Error"/>
<OperationalState ID="SuccessState" MonitorTypeStateID="SuccessState" HealthState="Success"/>
</OperationalStates>
<Configuration>
<IntervalSeconds>300</IntervalSeconds>
<SyncTime/>
<ServerName>$Target/Host/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ServerName>
<SqlInstanceName>$Target/Host/Host/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.ServerRole"]/InstanceName$</SqlInstanceName>
<Value>$Data/Property[@Name='PoolUsedMemoryPercent']$</Value>
<PoolID>$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.ResourcePool"]/PoolID$</PoolID>
<Threshold>90</Threshold>
<TimeoutSeconds>180</TimeoutSeconds>
<ScriptDelayMsec>0</ScriptDelayMsec>
<NumSamples>6</NumSamples>
</Configuration>
</UnitMonitor>