Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

we are using windows 2003 server with dual CPU and IIS gets overflown with requests and not able to handle them but at the same time it uses less than 20% of the CPU and less than 40% of ram. When server is not able to serve any requests not only its not possible to browse the site but its not even serving images which are used on our other sites. We are thinking of installing VMWare to have 2 servers on this machine and using one server to serve asp.net pages and the other one to serve images and simple html pages. Do you guys know how we can route image and html pages requests to one server and requests for aspx pages to another?

Any ideas are appreciated.

Thank you, Denis

share|improve this question

6 Answers 6

Hmnn, how many requests per second (split up on static and dynamic) are we talking about, and on which hardware? Your post doesn't provide specifics, but it sounds a bit strange that IIS should be overwhelmed and still only use 40% CPU.

I would definitely not use VMWare for this. Virtualization is a great technique, and has many good uses, but this is not one. All virtualization has a performance overhead over running on 'bare metal', and this would make you worse off in this scenario.

Go dig into logfiles, and look into Performance Monitor metrics for CPU, network I/O, disk I/O and RAM usage, and see if this points you in any specific direction.

Are there any devices in front of the IIS that could be overloaded? Cheap SOHO firewalls, any HTTP proxies, any "content inspection" firewalls or IDS systems?

The aspx code that you're running, have you looked at it? Does it have any stupid design decisions that could pause the entire computer, such as doing massive disk thrashing or exhausting thread pools?

If the server really is at its limits, and there is no quick win, then the following could be considered:

A cheap solution could be to set up 2 DNS hostnames, i.e. www.companyname.com and static.companyname.com and then set up 2 sites in IIS, one optimized for static file serving, one for dynamic content (aspx). For static files I would generally enable persistent HTTP connections, for dynamic content I would disable it. Optimizations might get you some room to breathe performance-wise, but it may or may not be enough. AFAIK there is no way to guarantee a specific resource allocation between sites in IIS 6.

The optimal way to go with regards to separating static content is to move all static file serving completely off the server, either by dedicating a new server to the task, or even better by using a CDN.

Pricing for low-end CDNs has come down dramatically, with Amazon S3 + Cloudfront, CacheFly and others having a low entry price. Of course adding a CDN means adding another single point of failure to your overall architecture, but CDNs are mostly good at keeping a high uptime, due to their distributed nature. Adding a CDN will potentially make your site feel faster for overseas users.

share|improve this answer

Are you sure that the problem is the server and not your bandwidth or maybe the number of connections which are opened (maybe on the firewall)?

Try to get some data collected using Windows' Performance Monitor. You could also try to isolate the webs putting them in different application pools, before you set up a virtual server.

share|improve this answer
    
Thanks for the response. Yep, bandwidth is good. –  Denis Aug 5 '09 at 15:54

In what sense "not able to handle"? Does IIS throw an error? Anything in the access_log or HTTPERR log?

As well as network bandwidth, I'd also look at disk activity and memory. If memory committed exceeds what you have in the machine, there's one possible answer: windows is having to swap out and your disks will be busy.

If memory looks good, check disk activity anyway: are they too slow for the amount of requests coming in?

In terms of routing, the only thing you could do without rewriting pages is to have a proxy server in front of the servers that routes requests based on URL. This could be a UNIX/Linux box with Squid or Apache or Windows with some form of proxy server, or maybe even dedicated load balancer hardware.

share|improve this answer

You actually might want to try this answer from Stack Overflow to open up your TCP/IP stack.

Windows Registry Editor Version 5.00


[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"EnablePMTUDiscovery"=dword:00000001
"MaxUserPort"=dword:0000fffe
"TCPTimedWaitDelay"=dword:0000003c
"TCPMaxSendFree"=dword:0000ffff
"SynAttackProtect"=dword:00000001
share|improve this answer

Perhaps you could upgrade to Windows Server 2008 and IIS7 and use Application Request Routing.

share|improve this answer

You have a solvable problem on your hands. If you attempt to bandaid it with VM, you're just going to turn your solvable problem into 3 problems, 2 of which will not be solvable.

PerfMon will probably tell you you have long-running ASP or ASP.NET requests causing your Asynchronous Threads to overload. If that's correct, you can truly, only solve this problem by speeding up your request processing.

The easiest way forward is probably to turn on the advanced logging property, "Time Taken," and require of your developer (yourself?) that every page process in fewer than X milliseconds. It is possible to process long running requests through multiple, quick asynchronous requests, so don't take no for an answer.

The image load problem you're having is a symptom and a blessing. It's telling you that there's work you can be doing.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.