我正在尝试修复 Azure 应用服务与 Azure 数据库连接速度非常慢的问题。
从廉价的 OVH 托管服务器迁移 Wordpress 后,我注意到 TTFB 非常长:从 300-400 毫秒增加到 1500-3000 毫秒。
我将问题缩小到应用服务 - 数据库连接问题。为了查明问题,我创建了干净的 Wordpress 安装。根据 P3 - 插件性能分析器,干净的 WP 安装会创建 38 个数据库查询。
使用 PHP/MySQL CPU 性能统计插件我运行了 MySql 测试:
- Azure 应用服务:每秒 20-50 个数据库查询
- 廉价 OVH 托管:每秒 200+ 数据库查询
我认为,如果 200 美元/月的 Azure stack 比 10 美元的 OVH 慢大约 20 倍,那么问题就非常明显了(但是:我发现即使每秒约 40 db 查询也会导致 TTFB 达到 300ms 左右,这正是我的目标)。
为了解决这个问题,我尝试了以下测试/更改:
- 不同的应用服务计划(从 dev 到 P2v3)
- 不同的 Azure 数据库服务器(从最便宜的到约 300 美元/月)
- PHP 7.4 和 PHP 8.0
- Apache 和 nginx(php 7/8 更改后自动出现)
- Azure 数据库单一服务器和灵活服务器
- Azure Database for MySQL 和 MariaDB
- 应用服务通过公共 IP 和 vnet 集成连接到数据库
- 将数据库置于完全相同的可用区域
- SSL 和非 SSL 应用程序/数据库连接
- 数据库重定向mysqlnd_azure
- 尝试连接持久性
- App Service docker 容器中的 Wordpress
以上都不是对性能没有任何重大改变。唯一“有效”的“修复”是启用缓存。如果命中缓存,TTFB 预计约为 100 毫秒。
我还对 AWS Elastic Beanstalk/RDS 和 Google App Engine/CloudSQL 进行了基准测试,它们运行完美(开箱即用,TTFB 时间约为 250 毫秒)。连接到同一 Azure 数据库的 Azure VM(PHP+ Apache)运行良好(TTFB 时间小于 300 毫秒)。
我没什么主意了。我错过了什么?需要说明的是:我并不是想实现个位数的响应时间或终极性能 - 对于干净的 WP 安装,300 毫秒是可以接受的。
答案1
由于问题中没有提及,因此有几件事需要查看。
- 确保 Web 应用和数据库位于同一区域。这看似简单,但我之前也见过。
- 使能够始终开启在 Azure 应用服务的设置中。 始终开启:即使没有流量,应用也会保持加载状态。当 Always On 未开启(默认)时,应用会在 20 分钟内无任何传入请求后卸载。卸载的应用可能会因为预热时间而导致新请求延迟过高。当始终开启开启后,前端负载均衡器每五分钟向应用程序根发送一次 GET 请求。持续的 ping 可防止应用程序被卸载。
- 审查应用服务最佳实践。
答案2
我也遇到了同样的问题。Azure 非常非常慢,而且什么都不起作用?
PP_1,您说的启用缓存是什么意思?您是指 WP Rocket 之类的插件吗?
答案3
这里有同样的问题。我已经通过 web ssh 连接到容器实例进行了一些测试,我发现它需要 php仅加载插件就需要 200-300 毫秒.h所以我的最终结论是azure的php有问题。
我很好奇,是否有人在没有缓存的情况下(在 Linux 上使用 php)在 Azure 上达到了良好的性能。
我们最终使用启动脚本配置了应用程序,该脚本重新配置了 NGIX 以积极缓存页面,这对我们的一些网站来说效果很好,但远非理想。对于缓存页面,我们现在的 TTFB 为 50ms。
答案4
问题在于 Azure 应用服务使用存储的方式。这就是插件加载时间如此之长的原因。
简而言之,应用服务无法托管 Wordpress!