Home » Php » WordPress on IIS 7 php-cgi hogging CPU

WordPress on IIS 7 php-cgi hogging CPU

Posted by: admin July 12, 2020 Leave a comment

Questions:

Running WordPress on IIS 7 (Windows Server 2008) with WP-SuperCache as per IIS.net’s guide.

Was running great but recently we changed the permissions on some folders and the administrator password and we’re getting huge spikes in our CPU usage as a result of the PHP-cgi.exe processes.

cpu usage

php-cgi.exe processes

This leads me to believe it’s not caching however the pages themselves have the “Cached with WP-SuperCache” comments at the bottom, and the caching seems to be working correctly.

What else could be the issue here?

How to&Answers:

I think I may have found a solution or at least a work round to this problem, at least it seems to be working for me reliably.

Try setting the Max Instances setting, under IIS Server –> FastCGI Settings, to 1.

It seemed to me that only certain requests were causing a php-cgi.exe process to go rogue and hog the cpu, usually when updating a post. When reading other posts on this issue one of them mentioned the Max Instances setting and that it is set to default at 0 or automatic. I wondered if this might not have a good effect when things aren’t as they should be. I’m guessing (but this isn’t quite my field of expertise) if a certain request(s) is causing the process to lock-up, so FastCGI just creates another, whilst leaving the first in place. Somehow it seems only having a single instance allows PHP to move on from the lock-up and the cpu stays under control.

For servers with high-levels of requests setting FastCGI to only a single instance may not be ideal, but it certainly beats the delays I was getting before. Used in combination with WP-SuperCache and WinCache, things seem to nipping along nicely now.

Answer:

Looking at that task mgr looks like its missing the cache on every request. Plus that article dates to 2008 so difficult to say whether the directions as written would still work. Something with WP-SuperCache could have changed.

I would recommend using W3 Total Cache. I’ve done extensive testing with it on Windows Server 2008 and IIS 7 and it works great. It is also compatible with and leverages the WinCache extension for PHP. Has some other great features too if you’re interested, minification, CDN support, etc. It’s a really great performance plugin for WordPress. You can get the plugin here, http://wordpress.org/extend/plugins/w3-total-cache/

some other things to check…

What size is the app pool? (# of processes?)
Make sure you are using PHP 5.3.
Make sure you are using WinCache.
Make sure to set MaxInstanceRequests to something less than PHP_FCGI_MAX_REQUESTS. Definitely do not allow PHP to handle recyling the app pool. The default is 10K requests. If you are seeing these results during a load test then this might be the cause. Increase MaxInstanceRequests and keep it one less than PHP_FCGI_MAX_REQUESTS.

Hope that helps.