Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

High memory usage with w3wp application pool IIS 7

Tags:

I have a website application running in it's own application pool on IIS 7.0. The application is an ASP.NET MVC 3 website.

I have noticed the memory usage for this applications corresponding w3wp IIS worker service is quite high ( 800 MB, with some fluctuation ).

I am trying to diagnose the problem and have tried the following:

I have disabled output page caching for the website at IIS level and then recycled the application pool. This causes the w3wp process to restart. The memory usage for this process then slowly creeps up to around 800 MB, it takes around 30 seconds to do so. There are no page requests being handled at this time. When I restart the website from IIS the memory size of the process does not alter.

I have tried running a debug copy of the application from VS 2010, there are no problems with memory usage.

Some ideas I have/questions are:

Is this problem related to the websites code? - Given that the memory rockets before any page requests have been sent/handled, I would assume this is NOT a code problem?

The application built in MVC has no handling of caching written into it.

The website uses real-time displaying of data, it uses ajax requests periodically, and is generally left 'open' for long periods of time.

Why does the memory usage rocket up after the application is recycled and no user requests are being sent? Is this because it is loading old cache information into it's memory from disk?

The application does NOT crash, I'm just concerned about the memory usage, it is not that big of a website...

Any ideas/help with getting to the bottom of this problem would be appreciated.

like image 431
user989056 Avatar asked Mar 12 '12 11:03

user989056


People also ask

How do I limit the application pool memory in IIS?

To do so, click Application Pools on the left tree menu and click the Set Application Pool Defaults on the right in the Actions menu. Scroll down to Recycling and in the Private Memory Limit (KB) type in the desired memory limit in KB.

How much memory should an IIS worker process use?

A healthy IIS Server will consume approximately 300 - 600 MB, maybe 700 MB RAM when busy. When it uses more than 700 MB RAM, it's telling you that: You have a lot of concurrent web users. The resources loaded on the web console are intensive.

Which IIS worker process is consuming more memory?

In general, high memory is when your ASP.NET worker process (Aspnet_wp.exe) or Internet Information Services (IIS) worker process (W3wp.exe) memory is consistently increasing and isn't returning to a comfortable level.

What to do when memory usage is high in IIS?

The first thing you should do when you encounter the high memory usage is to determine whether the memory of a worker process on an application pool in IIS is leaked or not. You can use Performance Monitor.

Why is the IIS worker process (w3wp) using so much RAM?

The IIS Worker Process (w3wp.exe) is consuming more than 700 MB RAM on the Orion Web Server. This will cause issues when using the Orion Web Console. The Microsoft Internet Information Services (IIS) Worker Process (w3wp.exe) is consuming more than 700 MB RAM on the Orion Server.

What is Microsoft's warranty on IIS pool memory allocation?

Microsoft makes no warranties, express or implied. This troubleshooter will help you to identify the cause of native memory leak in an IIS application pool. It's important to keep in mind that it is normal for high memory allocation as a web application serves requests.

Why is my w3wp process experiencing high memory usage?

Once you have confirmed that a w3wp.exe process is experiencing high memory usage, you will need to two pieces of information in order to determine what is causing the problem. A Performance Monitor data collector set. A user-mode memory dump of the w3wp.exe process.


2 Answers

The best thing to do if you can afford to use a debugger is install the Windows Debugging Tools and use something like WinDbg and SOS.dll to figure out exactly what is it in memory.

once you've installed the tools then you can:

  1. Launch Windbg.exe running elevated (as Administrator)
  2. Use "File->Attach To Process" and choose w3wp.exe for the app you are trying to figure out. If you have many you can use Task Manager and add the command-line column to see the PID or use IIS Manager->Worker Processes to figure it out, and then choose that process in WinDBG.
  3. run:
  4. .loadby sos clr
  5. !dumpheap -stat

At that point you should be able to see all types sorted by the most memory consumption so you can start with the ones at the bottom. (I would recommend exclude Strings, and Object since those are usually a side-effect and not the cause). Use "!dumpheap -type type-here" to find the instances and use !gcroot for those to figure out why they are in memory, maybe due to a static field, or an event handler leaked, WCF channels not disposed, or things like that are common sources.

like image 96
Carlos Aguilar Mares Avatar answered Oct 15 '22 05:10

Carlos Aguilar Mares


I just looked my server and my pools use 900-1000 MB Virtual size Memory, and 380 MB Working set. My sites run smooth with out problem for some years now, and I have checked the sites from all sides. My pool never recycles and the server runs until the next update continuously with 40% stable free physical memory.

If your memory is not continuously growing, then this memory is the code plus the data that you set as static, const, the string, and the possible cache, inside your application.

You can use process explorer to see the working and the virtual size memory.

You can also think to run a profile against your code to see if you have any "memory leak" or other issue. Find one from google: https://www.google.com/search?hl=en&q=asp.net+memory+profiler.

like image 24
Aristos Avatar answered Oct 15 '22 05:10

Aristos