22

The IIS worker processes are taking lot of memory on our servers. I want to limit the memory each application can use. I am confused whether I should set a limit on Virtual Memory Limit, or Private Memory Limit. Each application in our IIS is on its own application pool.

If I set private memory limit to 500MB and virtual memory limit to 3GB. When does the application pool recycle? Does it recycles after reaching 500MB or after reaching 3GB.

kishore
  • 852
  • 3
  • 13
  • 27

2 Answers2

24

IIS will respect both of those limits.

If you set a 500MB private byte limit, as soon as a worker process attempts to commit 501MB, IIS will spin up a new worker process and kill the old one.

If you set a 3GB virtual memory limit, as soon as a worker process attempts to reserve 3.001GB, IIS will spin up a new worker process and kill the old one.

If you are on a 64bit platform, you should be aware that ASP.NET applications aggressively reserve virtual memory. As an example, I have an app on a farm that uses only 88MB of private bytes, but its sitting at 5.4GB Virtual Size right now. I believe the virtual memory reservation is a function of physical RAM on the server. It's also important to understand that on a 64bit platform, reserving large portions of virtual memory has zero performance impact.

Basically, if you are having memory consumption issues on an IIS server, the setting you want to limit is Private Memory/Bytes, this is what corresponds to actual memory usage.

user3163495
  • 103
  • 3
Dominic D
  • 1,376
  • 9
  • 10
  • Thanks Dominic, Is there a way we can set a process to use 500Mb private memory and once it crosses that limit, start using virtual memory on the disk without recycling? – kishore Aug 06 '10 at 17:05
  • 2
    Not that I'm aware of. In an ASP.NET application once you start to have commit bytes issues you basically have 3 options. 1. Recycle the process when you reach the limit or nightly at an off hour (obviously not preferred, and don't forget to manage session data correctly if recycling during a usage window) 2. Get additional physical memory for the application (add RAM to server farm, or move to different farm, this can be the simplest solution depending on your situation). 3. Modify the application such that it uses memory more efficiently. (Best option, but may be difficult to implement) – Dominic D Aug 06 '10 at 18:54
  • I also noticed the aggressive reservation of memory in several ASP.NET apps. Can anybody recommend some good resources on this topic to study? I'd like to understand more about how and why it happens... What I observe is that the more memory there's available, the more memory the apps allocate. – Tom Pažourek Oct 31 '17 at 08:53
0

I guess just to add to Dominic's older answer, on a 64bit pool you'll really want to be careful with the virtual memory allocation. I've seen the IIS worker process try to grab 22gb right away, where that was the value we were trying to set it to so the app pools crashed every minute. MS IIS best practices indicate these settings shouldn't be set, but DISA STIGs indicate you have to set them. Fun times.

https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/iis-best-practices/ba-p/1241577

VS DISA V-76869 The amount of virtual memory an application pool uses must be set.

V-76871 The amount of private memory an application pool uses must be set.