生产服务器在IIS 6.0上运行PHP应用程序。 在高峰时段,我们遇到了一些问题,php-cgi.exe进程数量增加了大约200个。服务器进入爬行状态,我们必须重新启动服务器多次才能恢复正常的行为。 当服务器正常运行时,我注意到在任务pipe理器中只有10-15个php-cgi.exe进程。
什么可能导致php-cgi.exe进程在繁忙时间从10-15增加到200左右? 我应该在哪里寻找原因?
IIS6 CGI通常是1请求 – > 1进程。 15个并发的PHP-CGI进程可能是由于15个并发的PHP-CGI请求造成的。 或者PHP进程的挂起率很高,而且它们不能正常退出。
在Windows上,进程启动并不像* nix那样便宜(我被告知); Windows线程是轻量级的,可以在进程内简单地启动,但是启动一个进程是非常昂贵的。
为每个传入的请求启动一个新的进程可以从“昂贵”到“灾难性”。 当你看到200个并发进程时,你的负载就会增加 – 也就是说,你有200个未完成的请求“正在运行”。 在某种程度上,性能将下降到新工作进入的地方,而旧工作可能会完成,如果你重新启动服务器来应付这个问题,那么你只是在惩罚用户。 谁可能马上发出另一个请求来重试它。
如果你的程序闲荡,你的应用程序也可能有一个挂钩的错误。 但那是靠的。
Anyhoo,这是一个啰嗦的方法:你试过FastCGI吗? http://learn.iis.net/page.aspx/247/using-fastcgi-to-host-php-applications-on-iis-60/
IIS上的FastCGI允许重用现有的不存在的进程池,所以不是每个请求启动,处理和退出一个新进程,而是将每个请求分发给运行PHP-CGI的工作进程池(本例中为PHP-CGI)。
每个PHP-CGI实例都保持活动状态,同时有1000个请求通过它被抽取,然后允许退出,并启动一个新的实例。 从内存来看,有一组进程可以同时处理同时发生的请求(默认情况下可以是4,5或10,可configuration),性能应该(更好)。
它将为每个需要运行的脚本执行一次。 这是高峰时段…这些是您网站上的用户。
优化你的脚本来照顾这个。
这全都是基于带宽的。
每个连接都会创build一个php-cgi.exe的新实例
所以更多的用户=更多php-cgi.exe实例
你真的不应该使用IIS6与PHP,它不是很好的支持。 考虑切换到IIS 7.5。
因为进程(vs线程)是资源密集型的,所以当你有200个php-cgi进程运行时,你的系统占用了所有可用的RAM。
尝试将maxInstances设置为10 * CPU处理器的数量。
这限制了可以分拆的CGI进程的数量。
此外,作为纯粹基于CGI的PHP的IIS替代scheme,您可以使用将PHP用作Apache模块(基于线程)的WAMP包。 这将大大减less占用的资源,并且通常可以处理更多的连接。 我使用一个叫做WampDeveloper Pro的产品已经准备就绪并且得到支持。 还有XAMPP和WAMPServer是免费的,但可能不是生产环境中最好的东西。