我的生产服务器是 Windows Server 2012 R2、Apache 2.4、PHP 5.6 和 MariaDB(不确定版本,可能不相关)。我有一个在 Silverstripe 3.5 上运行的自定义网站。
最近,我在执行某些操作时遇到了奇怪的 TTFB,最明显的是登录(超过 30 秒),或者有时在浏览后端时随机出现。奇怪的是,这种情况并没有发生在我们配置类似的开发服务器上,我们的 IT 部门将仔细httpd.conf
检查php.ini
是否存在可能存在问题的差异。
我启用了 Zend OpCache 扩展,希望它会有所帮助,但我没有看到任何显著的改进。
我安装了 XDebug 并在登录时触发了分析(通过 DOM 检查器添加名为 XDEBUG_PROFILE 的隐藏表单字段),但在 WinCachegrind 中查看的输出显示 PHP 的执行累计时间不超过 5 秒 - 即总累计时间为main.php
4.x 秒。框架逻辑或数据库访问中似乎没有明显的瓶颈。
httpd.exe
在请求期间占用了我 14% 的 CPU。使用 Powershell 查看日志gci -Wait
显示,请求直到响应发送后才记录access.log
(不确定是否正常行为),并且没有弹出任何错误。
我很困惑,为什么 Apache 处理请求要花这么长时间,而 PHP 声称只需 4 秒钟即可完成逻辑处理。虽然可能的解决方案值得赞赏,但我真的很想知道我还能从哪里进行诊断,以找出导致 Apache 速度如此缓慢的原因,例如文件访问、跟踪执行等?我甚至不知道从哪里开始查找。
答案1
数据库是不是瓶颈。讽刺的是,缓存- 它是已知问题是,Zend_Cache_Backend_File
如果网站有大量数据、模板和图像需要缓存,基于缓存的速度会非常慢果然,服务器上的 silverstripe-cache 文件夹中有超过 5,000 个文件。
添加以下行以./mysite/_config.php
禁用缓存,可立即带来巨大的改进(登录时的 35 秒 TTFB 缩短至不到 0.5 秒!):
SS_Cache::set_cache_lifetime('default', -1, 100);
然而,这只是一个临时解决方案。我们将研究实施更持久、更实用的缓存处理解决方案,例如将 ramdisk 与文件系统后端结合使用,或利用使用内存池(如 XCache 或 Memcached)的后端,以及努力转向 Silverstripe 4.x,Zend_Cache
以支持symfony/cache
。
但鉴于我的办公室喜欢让官僚主义阻碍一切......可能还需要一点时间才能实现。