php - PDO 建立与 Azure PostgreSQL 的连接非常慢
问题描述
我有 PHP 应用程序作为基于 Kubernetes 内的 Alpine Linux 的 Docker 容器运行。一切都很顺利,直到我尝试使用测试数据库删除容器并用Azure PostgreSQL替换它。这导致延迟从 250 毫秒以下显着增加到 1500 毫秒以上。
根据分析器,大部分时间都花在PDO 构造函数上,该构造函数正在建立与数据库的连接。SQL 查询本身,在建立连接后,会在大约 20 毫秒内运行。
- 我尝试使用 IP 而不是地址,但它仍然很慢。
- 我尝试使用 psql 从容器连接,但速度很慢(请参阅下面的完整命令)
- 我尝试使用绑定工具进行 DNS 解析,速度很快。
- 数据库与 Kubernetes 节点在同一区域运行,甚至尝试了相同的资源组、不同的网络设置,但没有任何帮助。
- 我尝试在客户端和服务器上要求/禁用 SSL 模式
- 我尝试在已建立的连接中反复运行“选择 1”,它很快(平均 1.2 毫秒,中位数 0.9 毫秒)(请参阅下面的完整查询)
什么会导致这种延迟?如何进一步调试/调查此问题?
用于尝试连接的 psql 命令:
psql "sslmode=disable host=host dbname=postgres user=user@host.postgres.database.azure.com password=password" -c "select 1"
查询速度
\timing
SELECT;
\watch 1
解决方案
据我所知,这是由 PostgreSQL 之上的 Azure 特定身份验证引起的。不幸的是,Azure 支持无法从他们这边提供帮助。
使用连接池(PgBouncer)解决了这个问题。这是我们必须维护的另一部分基础设施(docker 文件、配置/秘密管理等),我们希望将其外包给云提供商。
推荐阅读
- java - SpringBoot WebTestClient - 如何在 graphql API 中使用 expectBody
- java - 读取 RequestMapping 注解值
- java - Java 中的 Envoy gRPC HTTP/1.1 桥接器
- c - C中的三元运算符
- excel - 在 VBA 中使用 LinEst 处理多线性多项式
- node.js - 为什么我的 React + NodeJS 在本地网络上无法访问?
- javascript - PROTRACTOR - 元素未附加到页面文档
- unity3d - 如何修复 Unity 3D 动画器窗口错误?
- python - 如何在 python 中加速 Elasticsearch 滚动
- wireless - 如何在带有 busybox 的设备上不使用 iptables 进行 NAT、POSTROUTE 和 MASQUERADE