我们有七个用
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从未进行垃圾收集会话,因此有数百万个会话文件.
但我仍然想知道为什么它只使用一个核心.这些网站现在要快得多,但我们还没有解决这个问题.有人知道吗?
问题最终是PHP保存会话文件(sess_)的文件夹中的权限错误.自从我们部署了这台服务器以来,垃圾收集从来没有工作过,或者它已经做了一段时间但我们更改了应用程序池的身份或其他东西,以便新身份无法访问删除文件.无论如何,我们在那个临时文件夹中有超过200万个sess_文件.花了几个小时,但最终完成了“del / F / Q sess_”命令,我们重新启动了网站,并再次恢复了一切(从平均页面加载时间60秒到远远不到1秒).我不知道这是否修复了“所有组合的cgi-PHP.exe进程永远不会使用多个核心组合”的问题与否,但我认为PHP的Windows实现中创建这些sess_文件的机制是有意义的可能是以这样的方式设计也导致了这种现象(例如,如果它是单个公寓的线程).
无论如何,故事的寓意是,如果你看到cpu消耗非常缓慢而稳定地增加(可能在单个核心的100%水平上),并且http响应时间也会缓慢增加,请检查存储你的文件夹PHP会话文件(sess_ *)并查看打开该文件夹时Windows资源管理器是否崩溃!