php - nginx + php-fpm 产生 300ms 开销
问题描述
我目前已经设置了一个服务器来托管一个 WordPress 站点,一个运行所有 nginx、php-fpm、WordPress 和 MariaDB 的服务器。该网站在主题中进行了大量定制。当我优化网站时,我从 WP 级别开始并取得了一些成功,调试栏报告 PHP 加载时间从 ~700ms 到 ~300ms,但是在开发人员控制台中 PHP 需要 ~600ms 才能完成加载(服务器 ping <20ms) . 这意味着 nginx 和 php-fpm 会产生大约 250 毫秒的开销。
为了隔离问题,我在 index.php 中使用了 microtime() 并确认整个 WP PHP 花费了 <350ms。
然后尝试解决,我尝试了这些设置:
- 使用 HTTP 并禁用 GZIP
fastcgi_buffering off
- 关闭访问日志
- 启用
tcp_nopush
和tcp_nodelay
然而改进并不显着。我想知道是否有可能摆脱约 250 毫秒的开销?在我看来,像 nginx 这样的高性能软件上的 250 毫秒是不合理的,应该能够被淘汰。任何线索和帮助表示赞赏。
PS:这是第一次询问SO,如果我不遵守约定和规则,请见谅。
解决方案
事实证明,应该归咎于 Autooptimize 插件。简而言之,Autoptimize 在开始时执行 ob_start 并开始缓冲整个 HTML 输出,当所有脚本结束时(即 index.php 退出),然后将执行 Autoptimize 的一些代码并进行缩小,然后将任何内容发送到 nginx。因此:
- 即使在 index.php 中使用 microtime() 也无法正确计时整个处理,因为缩小在index.php 结束后开始。
- 由于它缓冲了整个输出,因此在缩小完成之前无法发送第一个字节。
我们在 Autoptimize 上对各种配置进行了基准测试,结果基本上建议将其删除,即启用任何 HTML/CSS/JS 缩小都会降低性能/严重增加 TTFB。
基准
所有 CSS JS HTML 上
TTFB 513
Overall_Elapsed 593
Body Size 464598
Req Count 144-154
HTML 关闭,JS CSS 开启
TTFB 318
Overall_Elapsed 380
Body Size 518211
Req Count 144-155
HTML 开启,JS CSS 关闭
TTFB 478.5
Overall_Elapsed 519
Body Size 285995
Req Count 161-165
HTML JS CSS 关闭
TTFB 75.8
Overall_Elapsed 373
Body Size 340439
Req Count 163-172
在 WP 中禁用自动优化
TTFB 78.9
Overall_Elapsed 376
Body Size 339917
Req Count 163-171
- Req 由于广告网络而波动。
结论
在我们的主题中,我们有 12 个 JS 和 1 个 CSS,以及一些其他插件的 JS 和 CSS。由于我们可以轻松地将 12 个 JS 合并为一个 JS,由于减少了 19 个请求,我们可以自己减少其中的 11 个。
此外,Autoptimize 通过将整个 style.css 内联到其中来“保存”CSS 请求,<head>
这在很大程度上会使 HTML 膨胀。
因此,我强烈建议您尝试禁用自动优化,看看您的网站速度是否真的因此而提高。
推荐阅读
- javascript - HighCharts 如何将实时系列数据集添加到现有图表
- javascript - Node.js:如何从 MongoDB 中的光标返回当前文档
- mysql - 如何在不使用 CTE 由于版本错误的情况下重写 MySQL CTE 查询?
- java - 如何向 quarkus 注册注释处理器
- pandas - 对于通过 IntervalIndex 定义的列范围,如何计算 2D DataFrame bin 上的几何平均值和 stddev?
- ibm-datapower - 将 IBM Cloud 用于 SaaS API 管理和本地网关
- r - 从 r 中的 Search() 弹性创建的数据帧,但在使用生成的数据帧时收到错误'conn must be an elastic connection object
- objective-c - 使用自动布局时在 MacOS 上隐藏状态栏
- max - 根据测量的最大值创建排名分数
- html - 使用负边距属性时如何防止文本元素中的光标跳转