PHP 进程一次运行一个,始终占用 100% 的内核

Der*_*rth 3 php windows-server-2008 iis-7.5 cpu-usage

我们有七个用 PHP 编写的网站,它们运行在带有 IIS 7.5 的 Windows 2008 服务器上。他们现在都很慢。

当我查看任务管理器时,我看到大约 10 个 php-cgi.exe 进程,它们都占用了 0% 的 CPU,除了一个占用 25% 的 CPU。它是一个四核服务器,因此它占用了一个内核的 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>
Run Code Online (Sandbox Code Playgroud)

编辑#2:我们部分地想通了。由于权限问题,PHP 从不垃圾收集会话,因此有数百万个会话文件。

但我仍然想知道为什么它只使用一个内核。这些网站现在要快得多,但我们还没有解决这个问题。有人知道吗?

小智 5

问题最终是 PHP 保存会话文件 (sess_ )的文件夹中的权限错误。自从我们部署此服务器以来,垃圾收集从未工作过,或者它已经工作了一段时间,但我们更改了应用程序池的身份或其他内容,以便新身份无法访问删除文件。无论如何,我们在该临时文件夹中有超过 200 万个 sess_ 文件。花了几个小时,但最终“del /F /Q sess_“命令完成后,我们重新启动了站点,一切又都很好(从平均页面加载时间 60 秒到远少于 1 秒)。我不知道这是否修复了“所有组合的 cgi-php.exe”进程从不使用多个核心组合”问题,但对我来说,创建这些 sess_ 文件的 PHP 的 Windows 实现中的机制可能被设计为也导致了这种现象(如果它是单间螺纹,例如)。

无论如何,这个故事的寓意是,如果您看到 CPU 消耗非常缓慢且稳定地增加(可能在单核 100% 时保持稳定)并且 http 响应时间也缓慢增加,请检查您存储您的文件夹的文件夹php 会话文件 (sess_*) 并查看当您打开该文件夹时 Windows 资源管理器是否崩溃!:)

(顺便说一下,它是 W2k8(不是 R2)所以我认为它是 IIS 7 而不是 7.5)