IIS 上的多个 php-cgi.exe 进程

IIS 上的多个 php-cgi.exe 进程

生产服务器在 IIS 6.0 上运行 PHP 应用程序。在高峰时段,我们遇到了一些问题,php-cgi.exe 进程数量增加,接近 200 个。服务器变得非常缓慢,我们必须多次重启服务器才能恢复正常行为。当服务器正常运行时,我注意到任务管理器中只有 10-15 个 php-cgi.exe 进程。

是什么原因导致 php-cgi.exe 进程数量在高峰时段从 10-15 个增加到 200 个左右?我应该在哪里寻找原因?

答案1

IIS6 CGI 通常是 1 个请求 -> 1 个进程。15 个并发 PHP-CGI 进程可能是由于 15 个并发 PHP-CGI 请求。或者 PHP 进程的挂起率很高,而且它们无法正常退出。

在 Windows 上,进程启动并不像在 *nix 上那么便宜(有人告诉我);Windows 线程是轻量级的,可以在进程内简单地启动,但启动一个进程的成本很高。

为每个传入请求启动一个新进程可能会带来“高昂”到“灾难性”的后果。当您看到 200 个并发进程时,您的负载可能会增加 - 即您有 200 个未完成的请求“在进行中”。在某个时候,性能会下降到新工作进入的速度比旧工作完成的速度要快,如果您重新启动服务器来应对这种情况,那么您只是在惩罚用户。他们可能会立即发出另一个请求来重试。

如果您的进程停滞,您的应用可能也存在挂起错误。不过这只是顺便说一下。

不管怎样,这都是一个冗长的方法:您尝试过 FastCGI 吗? http://learn.iis.net/page.aspx/247/using-fastcgi-to-host-php-applications-on-iis-60/

IIS 上的 FastCGI 允许重用现有的非退出进程池,因此不是一个请求启动、处理和退出新进程,而是每个请求都分发到运行(在本例中)PHP-CGI 的工作进程池中。

每个 PHP-CGI 实例在处理 1000 多个请求时保持活动状态,然后允许其退出,并启动一个新实例来代替它。从内存中可以看出,有一组进程同时执行此操作以处理同时发生的请求(默认情况下可以是 4、5 或 10 个,可配置),性能应该会(好得多)。

答案2

这一切都基于带宽。

每个连接都会创建一个新的实例php-cgi.exe

因此,更多用户=更多实例php-cgi.exe

答案3

您确实不应该将 IIS6 与 PHP 一起使用,因为它的支持不太好。考虑切换到 IIS 7.5。

因为进程(相对于线程)是资源密集型的,所以当您运行 200 个 php-cgi 进程时,您的系统将占用所有可用的 RAM。

尝试设置maxInstances为 10 * 您拥有的 CPU 处理器数量。

这限制了可启动的 CGI 进程的数量。

此外,作为纯基于 CGI 的 PHP IIS 的替代方案,您可以使用将 PHP 用作 Apache 模块(基于线程)的 WAMP 包。这将大大减少所占用的资源,并且通常可以处理更多连接。我使用一个名为 WampDeveloper Pro 的程序,它已准备好投入生产并受到支持。还有免费的 XAMPP 和 WAMPServer,但在生产环境中可能不是最好的选择。

答案4

它将为每个需要运行的脚本执行一次。现在是高峰时段……这些都是您网站上的用户。

优化您的脚本来解决这个问题。

相关内容