我们有七个用 PHP 编写的网站,运行在装有 IIS 7.5 的 Windows 2008 服务器上。它们都是非常现在很慢。
当我查看任务管理器时,我看到大约 10 个 php-cgi.exe 进程,它们都占用了 0% 的 CPU,只有一个进程除外,它占用了 25%。这是一台四核服务器,因此它占用了一个核心的 100%。
如果我观察几秒钟,占用 25% 的进程将变为 0%,而另一个 php-cgi.exe 进程将跳转到 25%。因此,所有 php-cgi.exe 进程都排成一排,等待单个核心,并且每个进程在可能的情况下都会使用 100% 的处理器。
这 7 个站点中的每一个都在 IIS 中拥有自己的应用程序池,并且我们正在使用 FastCGI。PHP 版本是 5.3。
有什么想法吗?谢谢!
编辑:以下是我们的 FastCGI 设置:
<fastCgi>
<application fullPath="C:\Program Files (x86)\PHP\v5.3\php-cgi.exe" monitorChangesTo="C:\Program Files (x86)\PHP\v5.3\php.ini" activityTimeout="600" requestTimeout="600" instanceMaxRequests="10000">
<environmentVariables>
<environmentVariable name="PHP_FCGI_MAX_REQUESTS" value="10000" />
<environmentVariable name="PHPRC" value="C:\Program Files (x86)\PHP\v5.3" />
</environmentVariables>
</application>
</fastCgi>
编辑#2:我们部分解决了这个问题。由于权限问题,PHP 从未对会话进行垃圾收集,因此有数百万个会话文件。
但我仍然想知道为什么它只使用一个核心。网站现在快多了,但我们还没有解决这个问题。有人知道吗?
答案1
问题最终是由于 PHP 保存会话文件的文件夹 (sess_)。自从我们部署此服务器以来,垃圾收集从未起作用,或者它曾经起作用过一段时间,但我们更改了应用程序池的身份或其他东西,以便新身份无权删除文件。无论如何,我们在那个临时文件夹中有超过 200 万个 sess_ 文件。花了几个小时,但最终出现了“del /F /Q sess_“命令完成后,我们重新启动了网站,一切又恢复正常(平均页面加载时间从 60 秒缩短到 1 秒以内)。我不知道这是否修复了“所有组合的 cgi-php.exe 进程从未使用超过一个核心的组合”问题,但我认为,在 Windows 的 PHP 实现中,创建这些 sess_ 文件的机制可能被设计成也会导致这种现象(例如,如果它是单单元线程)。
无论如何,这个故事的寓意是,如果你看到 CPU 消耗非常缓慢而稳定地增加(可能稳定在单个核心的 100%)并且 http 响应时间也缓慢增加,请检查存储 php 会话文件的文件夹(sess_*)并查看打开该文件夹时 Windows 资源管理器是否崩溃!:)
(顺便说一下,它是 W2k8(不是 R2),所以我认为它是 IIS 7 而不是 7.5)