PDO与Azure PostgreSQL建立连接非常慢

时间:2018-09-16 11:11:55

标签: php postgresql azure pdo kubernetes

我在Kubernetes内将PHP应用程序作为基于Alpine Linux的Docker容器运行。一切顺利,直到我尝试使用测试数据库删除容器并将其替换为Azure PostgreSQL。这导致延迟时间从250ms以下大幅增加到1500ms以上。

根据事件探查器,大多数时间都花在PDO constructor中,后者正在建立与数据库的连接。 建立连接后,SQL会自行查询,然后在大约20毫秒内运行。

  • 我尝试使用IP代替地址,但仍然很慢。
  • 我尝试使用psql从容器进行连接,但速度很慢(请参阅下面的完整命令)
  • 我尝试使用bind-tools进行DNS解析,而且速度很快。
  • 数据库在与Kubernetes节点相同的区域中运行,甚至尝试了相同的资源组,不同的网络设置,也无济于事。
  • 我尝试在客户端和服务器上都要求/禁用SSL模式
  • 我尝试在已经建立的连接中反复运行“ select 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

1 个答案:

答案 0 :(得分:0)

据我所知,这是由PostgreSQL之上的Azure特定身份验证引起的。不幸的是,Azure支持无法从他们这方面提供帮助。

使用连接池(PgBouncer)解决了此问题。这是我们必须维护的另一基础架构(docker文件,配置/秘密管理等),我们希望将其外包给云提供商。