Memory Usage on the Server

Microsoft.SQLServer.AnalysisServices.Windows.Monitoring.Monitor.Instance.MemoryUsageByOtherProcess (UnitMonitor)

The monitor observes the memory usage by non Analysis Services processes on the server, to ensure Total Memory Limit for Analysis Services is always available.

Knowledge Base article:

Summary

Memory usage on the server hosting SSAS instance may impact the health and performance of the server by competing for shared resources from which the instance must also make allocations. This can lead to exhaustion of available physical memory on the computer, which can force the operating system to map virtual memory to the page file on disk, orders of magnitude slower than physical memory. For any business critical applications dependent upon a SSAS instance, the server should be configured in such a way that other processes (e.g., anti-virus, disk defragmentation, other instances of SSAS or the SQL Server relational database engine, etc.) do not allocate excessive memory, leading to this circumstance.

Causes

The most common processes to significantly compete with SSAS instances for memory primarily include other instances of SSAS, SQL Server relational database engine, or other database servers, since these tend to be the most intensive consumers of memory hosted on the servers, where SSAS is also hosted. Sometimes non-database software may also heavily consume the memory. As such, memory considerations may frequently affect the configuration of a server.

Besides, the value of free unreserved memory (FreeUnreservedPercent parameter) may become negative. This parameter is calculated as follows: 100% of the total memory minus high memory usage by the instance (SSAS), and minus memory usage by other processes. The reasons may be:

The Task Manager can be used to examine memory usage by various processes on the server. If instance(s) of SSAS (msmdsrv.exe) or SQL Server relational database engine (sqlservr.exe) consuming excessive memory, this is a simple way to identify their usage quickly, and, of course, it is also possible to see if other processes on the system are contributing to the condition. Subsequently, corrective actions (such as tuning memory usage of the instances by the SQL administrator, adding hardware, or reducing/dividing workload on the machine) may be devised accordingly.

Resolutions

Resolving issues of total server usage require the administrators to understand and consider numerous factors, including but not limited to workload requirements, user and job schedules, other scheduled processes on the server computer, and resources available. Actions to remediate excessive total memory allocations on the server computer may include any of the following actions:

External

TechNet documentation for Analysis Services memory properties

Configure Server Properties in Analysis Services

TechNet documentation for SSAS Performance Counters

Overridable Parameters

Name

Description

Default Value

Critical Threshold (%)

Health State changes to Critical, when Free Unreserved (%) drops below the threshold.

5

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.

900

Number of samples

Health State changes if the number of threshold breaches is greater than or equal to the Minimum Number of Breaches.

4

Synchronization Time

The synchronization time specified by using a 24-hour format. May be omitted.

 

Timeout (seconds)

Specifies the time the workflow is allowed to run before being closed and marked as failed.

300

Warning Threshold (%)

Health State changes to Warning, when Free Unreserved (%) drops below the threshold, but is still higher than Critical Threshold (%).

10

Element properties:

TargetMicrosoft.SQLServer.AnalysisServices.Windows.Instance
Parent MonitorSystem.Health.PerformanceState
CategoryPerformanceHealth
EnabledTrue
Alert GenerateTrue
Alert SeverityError
Alert PriorityNormal
Alert Auto ResolveTrue
Monitor TypeMicrosoft.SQLServer.AnalysisServices.Windows.Monitoring.MonitorType.Instance.MemoryUsageByOtherProcessPercent
RemotableTrue
AccessibilityPublic
Alert Message
SSAS: Other processes have allocated too much memory
The amount of memory prescribed by Total Memory Limit setting may be not available for SSAS, because other processes have allocated too much memory ({4} GB).
Total memory on the server: {2} GB
Total memory usage: {5} GB
Memory used by non-SSAS processes: {4} GB
Memory used by SSAS: {3} GB
SSAS Memory Limit Low: {6} GB ({7}\%)
SSAS Memory Limit High: {0} GB ({8}\%)
RunAsDefault

Source Code:

<UnitMonitor ID="Microsoft.SQLServer.AnalysisServices.Windows.Monitoring.Monitor.Instance.MemoryUsageByOtherProcess" Accessibility="Public" Enabled="true" Target="SQLAS!Microsoft.SQLServer.AnalysisServices.Windows.Instance" ParentMonitorID="SystemHealth!System.Health.PerformanceState" Remotable="true" Priority="Normal" TypeID="Microsoft.SQLServer.AnalysisServices.Windows.Monitoring.MonitorType.Instance.MemoryUsageByOtherProcessPercent" ConfirmDelivery="false">
<Category>PerformanceHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.AnalysisServices.Windows.Monitoring.Monitor.Instance.MemoryUsageByOtherProcess.AlertMessage">
<AlertOnState>Error</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>Error</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="Error" MonitorTypeStateID="Below" HealthState="Error"/>
<OperationalState ID="Warning" MonitorTypeStateID="Between" HealthState="Warning"/>
<OperationalState ID="Success" MonitorTypeStateID="Above" HealthState="Success"/>
</OperationalStates>
<Configuration>
<WarningThreshold>10</WarningThreshold>
<CriticalThreshold>5</CriticalThreshold>
<IntervalSeconds>900</IntervalSeconds>
<SyncTime/>
<TimeoutSeconds>300</TimeoutSeconds>
</Configuration>
</UnitMonitor>