Workload Management in Exchange 2013
Workload Management (WLM) is a great new feature that was introduced with Exchange 2013 (well, ok to be fair Exchange 2010 introduced the concept of User throttling. Exchange 2013 simply builds on that). The function of WLM is basically to preserve the user experience by throttling other processes. It is comprised of both User-based throttling (not discussed on this post as it is detailed on TechNet fairly well) and System throttling. To achieve this, different workloads in Exchange are assigned different priorities. For example, mailbox moves are a lower priority workload than, say, Transport (after all, it IS important to get that new email from your favorite coupon site, right?!?).
Starting with RTM and up through CU5, managing System Workload Management settings were available via the following cmdlets
*-ResourcePolicy
*-WorkloadManagementPolicy
*-WorkloadPolicy
WorkloadPolicy defined the classifications for various different workloads. Examples of Classifications include InternalMaintenance, CustomerExpectation, Discretionary and Urgent.
ResourcePolicy defined the Thresholds for the various classifications upon which those workload types would begin to be throttled (micro-delayed).
WorkloadManagementPolicy simply links the two together.
However, starting with CU6, these cmdlets disappeared, and the TechNet links were removed and replaced with this simple statement found here
Note:
The *-ResourcePolicy, *-WorkloadManagementPolicy and *-WorkloadPolicy system workload management cmdlets have been deprecated. System workload management settings should be customized only under the direction of Microsoft Customer Service and Support.
That is all fine and good (after all, I work in CSS!). But for a while, even I didn’t know how to view what the current settings were!!!
Alas – nothing (well, ALMOST nothing) can remain hidden forever. And so I found that the System workload management settings are now visible by using Get-ExchangeDiagnosticInfo. Now I do want to add a caveat here that this blog post will not provide information on how to modify System Workload Policies. However, I felt like it was important to be able to view what the current settings are so that you can understand why certain workloads might end up getting throttled.
If you haven’t already had the pleasure of using Get-ExchangeDiagnosticInfo, there is a lot of information available. I won’t delve in to everything that can be retrieved, but rather will focus on the System Workload policy-related information.
The general syntax to view System Workload policy information is
Get-ExchangeDiagnosticInfo –server <server> -process MSExchangeMailboxAssistants –Component SystemWorkloadManager –Argument policy
However – you will probably notice that the output from this cmdlet is XML format, which is, well, ugly to read. Lets clean it up a little, shall we? Define a variable for your command, and specify the format as XML so Powershell can format it.
[xml]$diag = Get-ExchangeDiagnosticInfo –server <server> -process MSExchangeMailboxAssistants –Component SystemWorkloadManager –Argument policy
Now that we have the data stored in memory, we can look at the components. The Policy is actually comprised of several sub-components. Lets look at the Resource policy portion first. This shows the Metric types (core resources that we measure the health of)
$diag.diagnostics.components.systemworkloadmanager.policy.resourcepolicy
MetricType |
MaxConcurrency |
ResourceMetricPolicy |
ActiveDirectoryReplicationLatency |
1024 |
{ResourceMetricPolicy, |
MdbLatency |
3 |
{ResourceMetricPolicy, |
Processor |
1024 |
{ResourceMetricPolicy, |
MdbReplication |
3 |
{ResourceMetricPolicy, |
CiAgeOfLastNotification |
3 |
{ResourceMetricPolicy, |
MdbAvailability |
3 |
{ResourceMetricPolicy, |
DiskLatency |
10 |
{ResourceMetricPolicy, |
Now notice that the ResourcePolicy actually has a property that is multivalued. We can look at that in more detail and see that each metric type has different values for each classification type. This is what allows workloads with a classification of a higher priority to continue working while those with a lower priority are throttled (micro-delayed).
$diag.diagnostics.components.systemworkloadmanager.policy.resourcepolicy.resourcemetricpolicy | ft
MetricType |
Classification |
UnderloadedThreshold |
OverloadedThreshold |
CriticalThreshold |
ActiveDirectoryReplicationLatency |
Discretionary |
5 |
25 |
45 |
ActiveDirectoryReplicationLatency |
InternalMaintenance |
5 |
25 |
45 |
ActiveDirectoryReplicationLatency |
CustomerExpectation |
5 |
30 |
50 |
ActiveDirectoryReplicationLatency |
Urgent |
5 |
60 |
100 |
MdbLatency |
Discretionary |
10000 |
20000 |
70000 |
MdbLatency |
InternalMaintenance |
10000 |
20000 |
70000 |
MdbLatency |
CustomerExpectation |
15000 |
30000 |
70000 |
MdbLatency |
Urgent |
25000 |
50000 |
100000 |
Processor |
Discretionary |
70 |
80 |
100 |
Processor |
InternalMaintenance |
75 |
85 |
100 |
Processor |
CustomerExpectation |
80 |
90 |
100 |
Processor |
Urgent |
100 |
100 |
100 |
MdbReplication |
Discretionary |
2097152 |
6291456 |
52428800 |
MdbReplication |
InternalMaintenance |
2097152 |
6291456 |
52428800 |
MdbReplication |
CustomerExpectation |
2097152 |
6291456 |
52428800 |
MdbReplication |
Urgent |
2097152 |
6291456 |
52428800 |
CiAgeOfLastNotification |
Discretionary |
60 |
180 |
240 |
CiAgeOfLastNotification |
InternalMaintenance |
120 |
180 |
300 |
CiAgeOfLastNotification |
CustomerExpectation |
180 |
240 |
600 |
CiAgeOfLastNotification |
Urgent |
240 |
300 |
600 |
MdbAvailability |
Discretionary |
11534336 |
105906176 |
1048576000 |
MdbAvailability |
InternalMaintenance |
11534336 |
105906176 |
1048576000 |
MdbAvailability |
CustomerExpectation |
11534336 |
105906176 |
1048576000 |
MdbAvailability |
Urgent |
11534336 |
105906176 |
1048576000 |
DiskLatency |
Discretionary |
10 |
20 |
30 |
DiskLatency |
InternalMaintenance |
10 |
20 |
30 |
DiskLatency |
CustomerExpectation |
10 |
20 |
30 |
DiskLatency |
Urgent |
50 |
50 |
50 |
Finally, we can view the workload policy, which provides the list of each defined workload type and the respective classification.
$diag.diagnostics.components.systemworkloadmanager.policy.workloadpolicy
WorkloadType |
Classification |
MaxConcurrency |
MailboxReplicationService |
Discretionary |
1024 |
ELCAssistant |
InternalMaintenance |
1024 |
JunkEmailOptionsCommitterAssistant |
CustomerExpectation |
1024 |
CalendarRepairAssistant |
InternalMaintenance |
1024 |
SharingPolicyAssistant |
InternalMaintenance |
1024 |
TopNAssistant |
InternalMaintenance |
1024 |
CalendarSyncAssistant |
InternalMaintenance |
1024 |
UMReportingAssistant |
InternalMaintenance |
1024 |
InferenceTrainingAssistant |
InternalMaintenance |
1024 |
StoreMaintenanceAssistant |
InternalMaintenance |
1024 |
PublicFolderAssistant |
Discretionary |
1024 |
DirectoryProcessorAssistant |
InternalMaintenance |
1024 |
PowerShell |
InternalMaintenance |
1024 |
PowerShellForwardSync |
CustomerExpectation |
1024 |
PowerShellBackSync |
CustomerExpectation |
1024 |
PowerShellGalSync |
InternalMaintenance |
1024 |
PowerShellLowPriorityWorkFlow |
InternalMaintenance |
1024 |
PowerShellDiscretionaryWorkFlow |
Discretionary |
1024 |
OABGeneratorAssistant |
CustomerExpectation |
1 |
Ews |
InternalMaintenance |
1024 |
Eas |
CustomerExpectation |
1024 |
Domt |
InternalMaintenance |
1024 |
Owa |
InternalMaintenance |
1024 |
TeamMailboxSync |
CustomerExpectation |
1024 |
Pop |
InternalMaintenance |
1024 |
Imap |
InternalMaintenance |
1024 |
Momt |
InternalMaintenance |
1024 |
Transport |
CustomerExpectation |
1024 |
TransportSync |
InternalMaintenance |
1024 |
OwaVoice |
InternalMaintenance |
1024 |
OrgContactsSyncAssistant |
InternalMaintenance |
1024 |
PublicFolderMailboxSync |
CustomerExpectation |
1024 |
InferenceDataCollectionAssistant |
Discretionary |
1 |
PeopleRelevanceAssistant |
InternalMaintenance |
1024 |
SiteMailboxAssistant |
InternalMaintenance |
1024 |
PushNotificationService |
InternalMaintenance |
1024 |
MailboxReplicationServiceHighPriority |
Urgent |
1024 |
StoreUrgentMaintenanceAssistant |
Urgent |
1024 |
StoreOnlineIntegrityCheckAssistant |
InternalMaintenance |
1024 |
StoreScheduledIntegrityCheckAssistant |
Discretionary |
1024 |
MailboxProcessorAssistant |
CustomerExpectation |
1024 |
E4eSender |
InternalMaintenance |
1024 |
E4eRecipient |
InternalMaintenance |
1024 |
MailboxAssociationReplicationAssistant |
CustomerExpectation |
1024 |
SharePointSignalStoreAssistant |
InternalMaintenance |
1024 |
PeopleCentricTriageAssistant |
InternalMaintenance |
1024 |
MailboxReplicationServiceInternalMai... |
InternalMaintenance |
1024 |
MailboxReplicationServiceInteractive |
CustomerExpectation |
1024 |
ProbeTimeBasedAssistant |
CustomerExpectation |
1024 |
DarRuntime |
InternalMaintenance |
1024 |
SearchIndexRepairTimebasedAssistant |
InternalMaintenance |
1024 |
DarTaskStoreTimeBasedAssistant |
InternalMaintenance |
1024 |
OutlookService |
InternalMaintenance |
1024 |
GroupMailboxAssistant |
InternalMaintenance |
1024 |
StoreDSMaintenanceAssistant |
InternalMaintenance |
1024 |
O365SuiteService |
CustomerExpectation |
1024 |
Enjoy!
Comments
- Anonymous
January 30, 2015
Thanks for sharing - Anonymous
November 03, 2015
Great post Ben, I've been looking for something public with all of this explained!