Exchange Online Throttling and Limits FAQ


What are the throttling settings for Microsoft Exchange Online as part of Microsoft Office 365? Before I answer this question, let me give you bit of background information. Microsoft Exchange includes bandwidth throttling to help manage server access. This supports service quality and consistent performance. The throttling components of Exchange Online are especially important, given that network resources in the datacenters are optimized for the broad set of customers that use the service. So, to properly engineer solutions that work with Exchange Online, you will need to account for the Exchange Online throttling settings.

We are specifically focused on throttling of Exchange Web Services (EWS) and MAPI with RPC over HTTP (as used by Microsoft Outlook) and with hard limits set by the Exchange Online system. Any mention of specific setting values were obtained for the service version 14.0.100.0. You will want to have your tenant admin obtain and confirm setting values.

Note   An on-premise Microsoft Exchange deployment may have a different throttling policy. Administrators can modify throttling settings for Microsoft Exchange on-premises. Administrators cannot configure throttling policies for Exchange Online.

What is the impact of exceeding throttling budgets?

Exchange throttling is based on the amount of Active Directory, Exchange store, and other resources a client consumes. A budget is allocated to each client to limit the resources a particular user consumes. This budget is recharged every minute.

EWS clients can exceed their budgets by sending too many concurrent requests, or by requesting too many resources on the server. When this occurs, additional requests are queued until one of two things happen:

  • The application is under budget. The request is then processed and the client experiences an increase in latency.
  • The request has been queued for more than 60 seconds, after which time the server sends an error response to the application.

When MAPI clients exceed their budgets, additional requests are returned with an error, until the application is under budget. There is no queuing of requests.

How do I get throttling settings?

Tenant administrators can view throttling settings by using Remote PowerShell and the Get-ThrottlingPolicy cmdlet. For information about how to connect Remote PowerShell for your tenant, see Install and Configure Windows PowerShell and Connect Windows PowerShell to the Service on Microsoft TechNet.

Use the Get-ThrottlingPolicy cmdlet (without arguments) to get all the throttling policy settings. Throttling policies might change to enhance service performance, so you should confirm throttling policies. We suggest that you make your client applications configurable to adjust for potential changes in throttling policy for Exchange Online. Additionally, because Exchange Online and Exchange on-premises might have different throttling policies, you may want to account for this when you design your client applications.

What are the common throttling settings?

The following throttling settings are common to both EWS and MAPI (RPC over HTTP) clients:

  • MessageRateLimit – Identifies the maximum number of messages that can be sent per minute. This is configured to count sent messages on a per IP address basis.
  • RecipientRateLimit – Identifies the maximum number of recipients that a sender can send to in a 24-hour period.
  • ForwardeeLimit – Identifies the maximum number of recipients that can be configured for Inbox rules when the user account is using the forward or redirect action.

What are the MAPI with RPC over HTTP throttling settings?

The prefix RCA in the MAPI RPC/HTTP settings represents RPC Client Access. The following throttling settings are specific to MAPI RPC over HTTP:

  • RCAMaxConcurrency – Identifies the maximum number of concurrent connections that can be maintained by MAPI RPC/HTTP clients (such as Microsoft Outlook) at any one time. Attempts to open more than the maximum number of connections will fail. Existing connections will remain unaffected. Active Directory calls count toward the number of concurrent connections. 
  • RCAPercentTimeInAD – Identifies the maximum amount of time that can be spent by a Client Access server when accessing Active Directory resources on behalf of a client, per minute. This budget is calculated by dividing the throttling value for this setting by 100 and then multiplying the result by 60 seconds. For example, an RCAPercentTimeInAD throttling value of 5 results in a throttling threshold of 3 seconds (5/100 * 60 seconds).
  • RCAPercentTimeInCAS – Identifies how much time all concurrent MAPI RPC/HTTP connections can consume on the Client Access server per minute. This is calculated on a per user basis. This budget is calculated by dividing the throttling value for this setting by 100 and then multiplying the results by 60 seconds. For example, an RCAPercentTimeInCAS throttling value of 205 results in a throttling threshold of 123 seconds (205/100 * 60 seconds). If the setting is 123 seconds, two concurrent MAPI RPC/HTTP connections can be open on a Client Access server for a full 60 seconds, thus using up 120 seconds per minute. A third connection can only use the remaining 3 seconds per minute, assuming all three connections occur concurrently and are initiated at the same time. 
  • RCAPercentTImeInMailboxRPC – Identifies how much time all concurrent MAPI RPC/HTTP connections can consume for accessing the mailbox per minute. This budget is calculated by dividing the throttling value for this setting by 100 and then multiplying the results by 60 seconds. For example, an RCAPercentTimeInMailboxRPC throttling value of 200 results in a throttling threshold of 120 seconds (200/100 * 60 seconds). This means that two connections can consume 60 seconds per minute (120 seconds total per minute) as long as there are no other connections.

What are the Exchange Web Services throttling settings?

The following throttling settings are specific to Exchange Web Services:

  • EWSFastSearchTimeoutInSeconds – Identifies how long an Exchange Search (indexed search) request will continue until it times out.
  • EWSFindCountLimit – Identifies the maximum number of search results in concurrent requests. For more information, see Throttling Policies and the EWS FindCountLimit. We suggest that searches all be paged and that the page size not exceed 1000 results.
  • EWSMaxConcurrency – Identifies the maximum number of concurrent connections that can be maintained by EWS clients at any one time. Attempts to open more than the maximum number of connections will fail. Existing connections will remain unaffected. Active Directory calls count toward the number of concurrent connections. 
  • EWSMaxSubscriptions – Identifies the maximum number of push, pull, or streaming notification subscriptions. If a server has too many notification subscriptions, it will start returning server busy errors. The server starts to return errors when the number of open connections reaches approximately 20 for a user. The charges for EWSMaxSubscription are calculated as follows:
    • Client – charged against the caller, also called the mailbox owner.
    • Intra-forest ExchangeImpersonation – charged against the caller.
    • Server-to-Server – charged against the underlying effective caller.
  • EWSPercentTimeInAD – Identifies the maximum amount of time that can be spent by a Client Access server when accessing Active Directory resources on behalf of a client account, per minute. This budget is calculated by dividing the throttling value for this setting by 100 and then multiplying the result by 60 seconds. For example, a EWSPercentTimeInAD throttling value of 50 results in a throttling threshold of 30 seconds (50/100 * 60 seconds).
  • EWSPercentTimeInCAS – Identifies how much time all concurrent EWS connections can consume on the Client Access server per minute. This is calculated on a per user basis. This budget is calculated by dividing the throttling value for this setting by 100 and then multiplying the results by 60 seconds. For example, a EWSPercentTimeInCAS throttling value of 90 results in a throttling threshold of 54 seconds (90/100 * 60 seconds).
  • EWSPercentTimeInMailboxRPC – Identifies how much time all concurrent EWS connections can consume while accessing a mailbox via RPC requests, per minute. This is calculated on a per-user basis. This budget is calculated by dividing the throttling value for this setting by 100 and then multiplying the results by 60 seconds. For example, a EWSPercentTimeInMailboxRPC throttling value of 60 results in a throttling threshold of 36 seconds (60/100 * 60 seconds). This means that a single connection can consume 36 seconds per minute as long as there are no other connections. Two connections that started at the same time can only consume 18 seconds each per minute. This is based on a threshold setting of 60.

For more information about EWS throttling policy, see EWS Best Practices: Understanding Throttling Policies.

What are the specific Exchange Web Services limits?

The following are the specific EWS throttling limits:

  • maxAllowedContentLength (IIS7) – Identifies the maximum accepted content length of HTTP requests. This maximum length is 35,000,000 bytes, which translates to 25 MB of base64-encoded data.
  • maxReceivedMessageSize (WCF) – Identifies the maximum message size that is accepted by EWS. This maximum message size is 35,000,000 bytes, which translates to 25 MB of base64-encoded data.

Note   The values for this limit differ for an on-premise Exchange 2010 deployment. In the initial release version of Exchange 2010, the message size limit is 10 MB. In Exchange 2010 Service Pack 1 (SP1), the message size limit is 35 MB.

  • maxRequestLength (ASP.Net) – Not used.

Comments (18)

  1. Ivan Serebrov (Quest Software) says:

    Administrators cannot configure throttling policies for Exchange Online.

    On one hand this makes total sense to not allow customers change the throttling settings in Exchange Online so that MS could have predictable load levels.

    On the other hand higher bandwidth may be required for migration purposes, which is a one-time project. I expect corresponding settngs may be changed by MS for a customer upon request, but this would require contacting support.

    I have an enhancement proposal: allow customer to change specific throttling settings for just one specific account. Use case: I want to run a migration and use third-party (not native migration-batch) tools for that. Those tools use an ms online administrator account to connect to Exchange Online. If there was a powershell cmdlet allowing to set higher throttling settings for this specific account, that would be great. Of course, throttling setting limits need to be defined for this account as well, but they can be considerably higher than the ones for generic users just using services.

    This would allow to:

    1. Still have predictable load levels.

    2. Eliminate the need for contacting support to do migration.

  2. The Get-ThrottlingPolicy commandlet is not available on office 365 online

  3. The Get-ThrottlingPolicy commandlet is not available on office 365 online. So the statement "Use the Get-ThrottlingPolicy cmdlet (without arguments) to get all the throttling policy settings" will not work for Office 365 domains. It is a pity that MS has not specified this anywhere and people spent hours setting up the environments just to figure out this doesn't work.

    I lost the time, don't want any one else to lose it again.

  4. i am sending the message with attachments of greater then 10 MB using MAPI 2.0 throws exception:

    Microsoft.Exchange.WebServices.Data.ServiceRequestException: The request failed. The underlying connection was closed: An unexpected error occurred on a send. —> System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send. —> System.IO.IOException: Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host. —> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host

      at System.Net.Sockets.Socket.MultipleSend(BufferOffsetSize[] buffers, SocketFlags socketFlags)

      at System.Net.Sockets.NetworkStream.MultipleWrite(BufferOffsetSize[] buffers)

      — End of inner exception stack trace —

      at System.Net.Sockets.NetworkStream.MultipleWrite(BufferOffsetSize[] buffers)

      at System.Net.Security._SslStream.StartWriting(SplitWritesState splitWrite, SplitWriteAsyncProtocolRequest asyncRequest)

      at System.Net.Security._SslStream.ProcessWrite(BufferOffsetSize[] buffers, SplitWriteAsyncProtocolRequest asyncRequest)

      at System.Net.TlsStream.MultipleWrite(BufferOffsetSize[] buffers)

      at System.Net.Connection.Write(ScatterGatherBuffers writeBuffer)

      at System.Net.ConnectStream.ResubmitWrite(ConnectStream oldStream, Boolean suppressWrite)

      — End of inner exception stack trace —

      at System.Net.HttpWebRequest.GetResponse()

      at Microsoft.Exchange.WebServices.Data.EwsHttpWebRequest.Microsoft.Exchange.WebServices.Data.IEwsHttpWebRequest.GetResponse()

      at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request)

      — End of inner exception stack trace —

      at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request)

      at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest(IEwsHttpWebRequest& request)

      at Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.InternalExecute()

      at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute()

      at Microsoft.Exchange.WebServices.Data.ExchangeService.InternalCreateItems(IEnumerable`1 items, FolderId parentFolderId, Nullable`1 messageDisposition, Nullable`1 sendInvitationsMode, ServiceErrorHandling errorHandling)

      at Microsoft.Exchange.WebServices.Data.ExchangeService.CreateItem(Item item, FolderId parentFolderId, Nullable`1 messageDisposition, Nullable`1 sendInvitationsMode)

      at Microsoft.Exchange.WebServices.Data.Item.InternalCreate(FolderId parentFolderId, Nullable`1 messageDisposition, Nullable`1 sendInvitationsMode)

      at Microsoft.Exchange.WebServices.Data.Item.Save(WellKnownFolderName parentFolderName)

      at

  5. Michael.Mainer says:

    @Shafdat_ali,

    I suggest you post your question with additional information to the Exchange development forum. I'd expect you will get answer sooner that way.

    social.technet.microsoft.com/…/threads

    With regards,

    Michael Mainer

    Microsoft Corporation

  6. Michael.Mainer says:

    @Regarding throttling policy cmdlets and Exchange Online.

    Yes, it is true that the throttling policy cmdlets were removed from Exchange Online. I've raised this as a concern with the product team.

    With regards,

    Michael Mainer

    Microsoft Corporation

  7. Kris Taracad @4Finance says:

    This was a very informative post with exactly the answer I was looking for. Unforunately we are using Exchange Online which limits what I can do but information is power. Thank you very much for this.

    Kris

  8. Ivan Serebrov (Dell Software Group) says:

    Michael, I heard Office 365 Wave 15 throttling has gotten more severe. For example, powershell sessions limit on per tenant basis was introduced. When could we expect an update to this article to reflect Wave 15 changes? Thanks!

  9. Jay Foster says:

    Michael,

    I want to move my office to cloud-based Amicus Cloud which works great with Outlook 2010.  I currently have Microsoft 365 which I would also keep.  However, I've gotten feedback from several law firms that say it literally takes "minutes" for an appointment to post sometimes using Amicus with Office 365 due to this throttling issue.  Any updates on this?

  10. Michael.Mainer says:

    @Jay Foster

    Creating an appointment would not come close to reaching a throttling limit. I'd have to know what their cloud service does before I could comment on it.

    With regards,

    Michael Mainer

  11. Aaron Guilmette says:

    Any way to see what the current tenant/organization throttling policy is?

  12. faizan rangari says:

    a) What causes this?

    b) What are the default values for the various PowerShell throttling parameters when using Office365?

    c) Is there any transparency in Office365 to see the current state of throttling, or any other tools that can assist us?

    d) Are the throttling parameters per user, per machine, or what?

  13. Justin says:

    I have a strange error that is occurring with EWS 2.0 and impersonation.  So the app syncs contacts in a specific user's folder for about 300 mailboxes using the impersonation account.  Nothing special.  It grabs them, compares them, and then sends modifications, creates, deletes, etc.  This has been working for months.  My app is multithreaded and designed to sync 10 mailboxes at a time.  In 6 months of operation, I am yet to receive a throttling error.  

    The problem: If one of the threads has an error occur during a batched create (like a bad phone number), it is handled in code, processes the good items and terminates correctly.  However, any outstanding exchange requests that were in process from the other 9 items are hung indefinitely.  They never register a timeout and never exit.  When I pause the app after waiting 10 times the timeout period it shows they are all hanging, and for different types of requests.  Some finding a folder, some finding contacts, some uploading batched updates, deletes or creates.  Any idea what could cause this to hang (assuming my app is coded properly).  

  14. Michael Mainer says:

    Hello Justin,

    This sounds like unexpected behavior on the part of Exchange. I'm sorry that I cannot offer you a solution to this scenario.

    I suggest you open a case for Exchange Developer Messaging support.. support.microsoft.com/…/en-us. In case you have a premier contract, you can use https://premier.microsoft.com/. You may want to try the forums.

    With regards,

    MIchael Mainer

    Microsoft

  15. Mohsin Abbas (blog.mohsinabbas.com) says:

    For migration purposes, if you have more than 1,000 mailboxes you can open a support case with the Exchange Online support team to have the throttling budgets increased for you.

    http://blog.mohsinabbas.com

  16. StefanW says:

    Hi, I am seeing strange Outlook behavior when sending emails. If I FTP a 10MB file it takes around 20sec to download/upload. If I send the file as an attachment using Outlook and Office365 it takes around 5mins to leave my OUTBOX, it appears roughly 5sec later in my OWA INBOX and then roughly 20sec in my OUTLOOK INBOX (so download similar to FTP)… if I attached the file into an OWA email it takes 1min24sec to attach, and then around 20sec to appear in my OUTLOOK INBOX once sent from OWA (again matching the FTP speed)… so the question is why the delay (which appears to be throttled) in sending from OUTLOOK to OFFICE365? I have run the MS OFFICE365 SUPPORT AND RECOVERY ASSISTANT, disabled COM addins, etc etc and also tested outside our firewall, no change. Would appreciate any direction….

    Regards,

    Stefan

  17. user says:

    Please update this blog or pull it from MSDN.  It is was published in 2011 and is outdated.