Memory and Handle Quotas in the WMI Provider Service

Memory and Handle Quotas in the WMI Provider Service

  • Comments 20
  • Likes

Hi folks, Mark Ghazai here once again with a quick tidbit on tweaking the WMI Provider Service (WMIPRVSE.EXE).  We’ve been getting some calls recently about the performance of this service and some failures that customers have been experiencing – in particular “Out of Memory” errors when certain WMI-related tasks are running.  We’ve talked about various memory management issues in previous posts, but the WMI Provider Service has some interesting quotas that administrators should be aware of.  So, as the saying goes … tally ho!

Within the WMI System Classes there is a configuration class for host provider processes.  The name of this class is _ProviderHostQuotaConfiguration.  This class allows limits to be set on host process usage of system resources.  The different properties available are:

  • ThreadsPerHost: Defines the number of threads owned by any one host
  • HandlesPerHost: Defines the number of kernel object handles each host may have
  • ProcessLimitAllHosts: Defines the total number of host processes that can be executing concurrently
  • MemoryPerHost: Defines the amount of private memory that can be held by each host
  • MemoryAllHosts: Defines the combined amount of private memory (in bytes) that can be held by all hosts

When the WMI Provider service reaches its quota limit, WMI queries that are being handled by that instance of WMIPRVSE.EXE will most likely fail.  However, there are applications like System Center that may require more memory or handles for the process.  These quotas are configurable, however – do not modify these quotas for the sake of modifying them!  If the WMIPRVSE.EXE process is actually leaking handles or memory, modifying the quota will only delay the issue from occurring, not eliminate it.  In instances such as these, normal leak troubleshooting must be performed to identify the root cause.

That having been said, if you are in a situation where there is a need to modify these values, you can do so using the steps below:

  1. Go to Start--> run and type wbemtest.exe
  2. Click Connect on the Windows Management Instrumentation Tester
  3. In the namespace text box just enter "root" (without quotes)
  4. Click Connect

    clip_image002

    Note: you aren’t connecting to CimV2 or any other namespaces. It’s ROOT

  5. Click "Enum Instances…"

    clip_image004

  6. In the Class Info dialog box enter Superclass Name as "__ProviderHostQuotaConfiguration" (without quotes) and press OK.

    clip_image006

  7. A query Result window will come up. In this windows now double click "__ProviderHostQuotaConfiguration=@"

    clip_image008

  8. An Object Editor windows will come up now
  9. Under properties find the property "MemoryPerHost" or any other ones you need to modify and double click it

    clip_image010

    <In the case of modifying the memory quota;>

  10. Change the value to 512 MB which is 536870912
  11. Click Save Property
  12. Click Save Object in the Object Editor window
  13. Close the other windows now and exit WMI Tester
  14. Restart the machine.

A quick note here - on Windows XP and Windows Server 2003 systems, the memory quota per host is 128MB.  For Windows Vista and Windows Server 2008 systems the memory quota per host is 512MB.  The rest of quotas are all the same.  And, with that, it’s time to bring this post to a close.  Take care!

Additional Resources:

- Mark Ghazai

Share this post :
Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment
  • Absolutely great article!

    I had a case of distributed processing where main unit launches many processes over network. I was stuck for several days trying to find any reasonable answer for crashing on OutOfMemory child processes launched via WMI.

    And finally I discovered your article that helped me 100%!

    Thanks a lot, guys!

  • Thank you for your article. It did not directly help me with my problem, but it put me on the right track.

    My issue was that I was getting a Quota violation every time I tried to start a notification event. Thanks to your article I was able to track the setting down. It turned out that the __ArbitratorConfiguration has a property called PollingMemoryPerUser and PollingMemoryTotal. These values were set at there default of 5 and 10 MB respectively. I was able to increase these values and run my notification query.

    Thanks again

  • Great!! Perfect article. This solved a big issue.

    Thank You.

  • Wish I could have reached the stage to actually run this...

    Unfortunately I have run into an issue when running WBEMTEST

    I type in "_providerhostquotaconfiguration" without the quotes of course and end up with an error...

    Number: 0x80041010

    Facility: WMI

    Description: Invalid class

    Whats up with that?

    Any ideas?

    Cheers

  • I am running some application using task scheduler. This app is using a lot of WMI queries. After task is finished WMI service doesn't release memory. Each run it consumes more and more memory until it reaches the quota described here. So, after couple hours(maybe be longer) I got "out of memory exception" for ~5-20 minutes, and i cannot run my queries during that time :-(. Shouldn't WMI provider release that memory? How do I troubleshoot - what specific query is leaking?

  • How to automate this?

    Now I need to do it on few machines

    How can I do it from powershell or commandline?

  • use a double __ as the prefix.  

  • What is the default value for "MemoryPerHost" on Windows 2008 R2 64-Bit?

    Also, what the maximum quota for this value on Windows 2008 R2 64-Bit?

  • Is there a default quota for the MemoryPerHost on a Windows 2008 R2 64-Bit? If so, what is the amount?

  • I get to step 6 and type in __ProviderHostQuotaConfiguration when I click on OK i get a box poppin up saying

    Number: 0x8004106c

    Facility: WMI

    Description: Quota violation

    I am running in circle...

    any idea ?

  • There is a fix for this problem. It happens that both Windows Server 2008 and Windows 7 have a memory leak on the Win32_Service Class.

    You can find the technet article here.

    blogs.technet.com/.../wmi-leaks-memory-on-server-2008-r2-monitored-agents.aspx

    In the above article is also the fix for that, I am attaching also the link: support.microsoft.com/.../981314

    Best regards,

  • Hi ,

    I want to know, Is restart really needed if I change the WMI memoryperhost value.

    I worte a VB script and and executed ,it changed the value without restarting.So is it not providing newly set memory value to the runing application?

    Thanks,

    Gyanendar

  • Yes, a restart is required for the new value to take effect.

  • What is the best way to deploy MemoryPerHost value setting of 536870912 to hundreds of Window 2003 server? Through GPO or via SCCM?  And if anyone knows how, how will it be done step by step?

    Thanks,

    TD

  • How do you setup the "MemoryPerHost" settings through the registry using Group Policy Preferences? Is it possible?