Kubernetes 上带有 Pgbouncer 的 Npgsql - 高延迟

Posted

技术标签:

【中文标题】Kubernetes 上带有 Pgbouncer 的 Npgsql - 高延迟【英文标题】:Npgsql with Pgbouncer on Kubernetes - hight latency 【发布时间】:2021-05-24 12:30:02 【问题描述】:

我有一个身份api,该项目或多或少是具有Aspnet核心身份的入门模板。它部署在 GKE 集群上,并使用 Google Cloud sql PostgresSql 作为数据库。

我的 jmeter 测试:在 api Account/LogIn 上 30 秒内有 6000 个请求;拥有 500 万 用户的数据库

使用 npgsql 的内部轮询器和连接字符串Pooling=true;Minimum Pool Size=100;Maximum Pool Size=500

P99 P95 AVG
700 ms 80 ms 40 ms

结果很好,但是在测试过程中 pod 的 cpu 接近 100%

在与Pooling=false的连接字符串中使用一个PgBouncer

P99 P95 AVG
53.22s 48.39s 9s

数字不言自明

查看 postgres 日志,查询解析和绑定似乎花费了 256 毫秒,查询执行后连接在 589 毫秒后关闭。

我是否缺少一些 npgsql 配置? 为什么每个查询都有解析和绑定?

[2186] => queryPerProcess Object
        (
            [numQuery] => 4
            [pidProcess] => 6030
            [processStartTime] => 2021-02-17 16:07:10.437
            [totalQueryTime] => 0.338
            [lastQueryTime] => 2021-02-17 16:07:10.438
            [discardQueryTime] => 2021-02-17 16:07:12.006
            [closeTimeDiff] => 568
            [lines] => Array
                (
                    [0] => 6030 2021-02-17 16:07:10.437 UTC identity Identity LOG:  duration: 0.112 ms  parse <unnamed>: SELECT a."Id" ... etc"

                    [1] => 6030 2021-02-17 16:07:10.438 UTC identity Identity LOG:  duration: 0.144 ms  bind <unnamed>: SELECT a."Id" .. etc "

                    [2] => 6030 2021-02-17 16:07:10.438 UTC identity Identity LOG:  duration: 0.039 ms  execute <unnamed>: SELECT a."Id" .. etc"

                    [3] => 6030 2021-02-17 16:07:12.006 UTC identity Identity LOG:  duration: 0.043 ms  statement: DISCARD ALL

                )

        )

【问题讨论】:

【参考方案1】:

那里似乎有多个问题...

首先,Npgsql 的池是一个进程内池,其中打开和关闭的开销极小。使用 PgBouncer,您的应用程序仍然必须建立 TCP 连接(甚至可能是 SSL 连接),这是不可忽略的开销。因此,即使您还打算使用 pg_bouncer(它可以用作服务器端池),通常也建议您保留 Npgsql 的池。

其次,如果你不准备你的语句,Npgsql 会为每个查询发送 Parse/Bind/Describe/Execute/Sync。你可能想看看Npgsql docs on preparation。

【讨论】:

感谢谢伊的回答,我问这个问题是因为,正如我所说,我正在使用具有 aspnet 核心身份的默认网络核心项目,所以登录管理器会完成所有工作。除了使用所有可用连接之外,使用 Npgsql 池的负载测试具有很高的 CPU 消耗。你是说我可以在连接字符串中使用 pgbouncer 作为主机,让轮询为真吗?我的配置就像这个问题***.com/questions/57759603/…中的配置一样。如果一个 api 占用所有连接,我将永远无法扩展 是的:让 Npgsql 的池保持打开 - 按照您发布的链接中的建议 - 如果您需要,请连接到 pg_bouncer。

以上是关于Kubernetes 上带有 Pgbouncer 的 Npgsql - 高延迟的主要内容,如果未能解决你的问题,请参考以下文章

多个端口上的 pgBouncer?

如何使用外部服务器配置 Kubernetes?

greenplum 连接池pgbouncer的使用

使用PgBouncer连接池

PgBouncer 和 PostgreSQL 的身份验证

linux ---pgbouncer的安装和配置