A while back I talked about a memory leak we had in one of our applications. As a consequence, it brought the full production environment to a halt impacting not only the causing application but all applications hosted on the same IIS instance.
Although we found the root cause and fixed the problem, we did a post-mortem to discuss on how to avoid this in the future. In this post, I'll walk you through the practical strategies we implemented to limit and optimize memory usage for our applications running in Internet Information Services (IIS).
n this guide, I'll walk you through practical strategies to limit and optimize memory usage for applications running in Internet Information Services (IIS).
Understanding memory usage in IIS
Before diving into solutions, it's important to understand how IIS manages memory. IIS runs web applications in application pools, which are processes (w3wp.exe) that host your web applications. Each application pool can consume memory independently, and without proper configuration, a single problematic application pool can negatively impact the entire server.
There are 2 distinct settings to manage memory usage in IIS:
- private memory limit
- virtual memory limit
Private memory limit
The private memory limit is the maximum amount of private memory (physical RAM) that a worker process in an application pool can use. It applies to the memory allocated exclusively to the process, not shared with other processes.
If the private memory usage of the worker process exceeds this limit, IIS will recycle the application pool to free up resources.
Virtual memory limit
The virtual memory limit is the maximum amount of virtual memory (address space) that a worker process in an application pool can use. It includes both physical memory and memory mapped to disk (e.g., page file).
Important: An application could claim up front a lot of virtual memory, so it is recommended to stay away from this setting and focus mainly on the private memory limit when limiting memory usage.
Key strategies for limiting memory usage
Configure Recycling Settings
Application pool recycling is one of the most effective ways to control memory usage:
- Open IIS Manager
- Select your application pool
- Click on "Recycling" in the Actions pane
- Configure the following settings:
- Fixed Interval Recycling: Schedule recycling at regular intervals
- Memory-Based Recycling: Set a memory threshold (in KB) that triggers recycling
- Request Limit Recycling: Recycle after processing a specific number of requests
- Specific Time Recycling: Schedule recycling at off-peak hours
Configure private memory limit
As already mentioned, you can set a maximum private memory limit for your application pool:
- Open IIS Manager
- Select your application pool
- Click on "Advanced Settings"
- Set "Private Memory Limit (KB)" to your desired value (e.g., 1048576 for 1GB)
When an application pool reaches this limit, IIS will automatically recycle it, freeing up memory.
Implement request limits
Set limits on request size and execution timeout:
Conclusion
Managing memory usage in IIS requires a multi-faceted approach that combines proper IIS configuration with application optimization. By implementing the strategies outlined above, we significantly improved the stability and performance of our web applications.
Of course all of this should not be an excuse to not optimize your application code first. Some tips:
- Dispose of resources properly: Ensure all disposable objects are properly disposed
- Avoid memory leaks: Check for common patterns that cause memory leaks
- Use caching judiciously: Excessive caching can consume large amounts of memory
- Implement proper object pooling: Reuse expensive objects when possible
- Enable server GC: Configure .NET to use the server garbage collection mode
More information
Visual Studio 2022 - Check for memory leaks
Azure Monitor Log Analytics–Identify high memory usage
IIS Best Practices | Microsoft Community Hub
iis 7 - How to limit the memory used by an application in IIS? - Server Fault