我有一些基于gevent的管理命令.因为我的管理命令发出数千个请求,所以我可以使用Gevent将所有套接字调用转换为非阻塞调用.这真的加快了我的应用程序,因为我可以同时发出请求.

目前我申请的瓶颈似乎是Postgres.这似乎是因为用于连接Django的Psycopg库是用C编写的,不支持异步连接.

我还读到,使用pgBouncer可以将Postgres的速度提高2倍.这听起来不错,但如果有人能解释pgBouncer的工作原理并提供帮助,那就太好了?

谢谢

推荐答案

除了节省connect&;断开连接如果对每个请求都执行此操作,连接池可以将大量客户机连接转移到少量实际数据库连接.在PostgreSQL中,活动数据库连接的最佳数量通常在((2 * core_count) + effective_spindle_count)个左右.超过这个数字,吞吐量和延迟都会变差.NOTE:最新版本提高了并发性,因此在2022年,我建议采用类似((4 * core_count) + effective_spindle_count)的版本.

有时人们会说:"我想支持2000个用户,并有快速的响应时间."几乎可以肯定的是,如果你试图用2000个实际的数据库连接来实现这一点,性能会非常糟糕.如果你有一台有四个四核处理器的机器,并且活动数据集被完全缓存,那么通过35个数据库连接,你会看到这2000个用户的性能会好得多.

为了理解为什么这是真的,这个思想实验应该有所帮助.假设一个假设的数据库服务器机器只有一个资源来共享——一个单一的核心.这个核心将在所有并发请求之间平均分配时间,而不会产生任何开销.假设100个请求都在同一时刻到达,每个请求都需要1秒的CPU时间.核心对它们都有效,在它们之间进行时间分割,直到100秒后全部完成.现在考虑一下,如果你在前面放置一个连接池,它将接受100个客户端连接,但每次只向数据库服务器发出一个请求,那么在连接忙到队列中的时候,请求任何到达的请求.现在,当100个请求同时到达时,一个客户端在1秒内得到响应;另一个客户端在2秒内得到响应,最后一个客户端在100秒内得到响应.没有人需要等待更长的时间才能得到响应,吞吐量是一样的,但平均延迟是50.5秒,而不是100秒.

一个真正的数据库服务器有更多可以并行使用的资源,但同样的原则是,一旦资源饱和,添加更多并发数据库请求只会造成损害.这实际上比示例更糟糕,因为任务越多,任务切换越多,锁和缓存争用增加,二级和三级缓存线争用,以及许多其他问题,这些问题会降低吞吐量和延迟.除此之外,虽然高work_mem设置可以在许多方面帮助查询,但该设置是限制per plan node for each connection,因此对于大量连接,您需要将其保持在非常小的范围内,以避免刷新缓存,甚至导致交换,这会导致较慢的计划或散列表溢出到磁盘之类的事情.

一些数据库产品有效地将连接池构建到服务器中,但PostgreSQL社区采取的立场是,由于最好的连接池是在离客户端软件更近的地方进行的,因此将由用户来管理.大多数池处理器都有办法将数据库连接限制为硬数,同时允许更多的并发客户端请求,并根据需要对它们进行排队.这是你想要的,应该在transactional个基础上完成,而不是每个语句或连接.

Postgresql相关问答推荐

在postgres中查找多个表中不同列的计数和总和

通过窗口函数收集反连接结果?

Docker化的PostgreSQL:FATAL:用户&postgres的密码身份验证失败

如何在生成的列的表达式中使用TIMESTAMP WITH时区列?

是否可以在psql查询输出中删除新行末尾的+号?

对表执行 DISABLE TRIGGER ALL 是否也会禁用 FK 指向该表?

Supabase 数据库大小问题

如何在 Postgres 中的列上删除唯一约束?

Heroku PGError:operator does not exist: character varying = integer

org.postgresql.util.PSQLException:错误:relation "app_user" does not exist

返回 NULL 的空数组的 array_length()

我如何知道我的 PostgreSQL 服务器是否使用C语言环境?

无法使用 sequelize 从本地 node 应用程序连接到 heroku postgresql 数据库

从没有行的计数中获取 0 值

用于更改 postgresql 用户密码的 bash 脚本

是否可以在 CSV 格式的 Postgres COPY 命令中关闭报价处理?

Postgresql varchar 是否使用 unicode 字符长度或 ASCII 字符长度计算?

在同一台机器上创建多个 Postgres 实例

如何使用 postgresql 按计数排序?

Postgresql 用随机值更新每一行