我有一个基于GEVENT一些管理命令。 由于我的管理命令使成千上万的请求,我可以把所有套接字调用到使用GEVENT非阻塞通话。 这确实加快了我的申请,我可以同时进行的请求。
目前在我的应用程序的瓶颈似乎Postgres的。 看来,这是因为用于连接到的Django的Psycopg库是用C语言编写,并且不支持异步连接。
我也看到,使用pgBouncer可以通过2X加速Postgres的。 这听起来不错,但将是巨大的,如果有人可以解释pgBouncer是如何工作的,并帮助?
谢谢
我有一个基于GEVENT一些管理命令。 由于我的管理命令使成千上万的请求,我可以把所有套接字调用到使用GEVENT非阻塞通话。 这确实加快了我的申请,我可以同时进行的请求。
目前在我的应用程序的瓶颈似乎Postgres的。 看来,这是因为用于连接到的Django的Psycopg库是用C语言编写,并且不支持异步连接。
我也看到,使用pgBouncer可以通过2X加速Postgres的。 这听起来不错,但将是巨大的,如果有人可以解释pgBouncer是如何工作的,并帮助?
谢谢
除了节省连接断开及的开销,这何处,否则对每个请求进行,一个的连接池可以漏斗大量的客户端连接到少数真正的数据库连接。 在PostgreSQL,活动的数据库连接的最佳数量通常约为某处((2 * core_count)+ effective_spindle_count)。 上面这个数,吞吐量和延迟变得更糟。
有时,人们会说:“我想支持2000个用户,具有快速的响应时间。” 这是相当多保证,如果你尝试这样做,与2000年实际的数据库连接,性能将是可怕的。 如果你有一台机器有四个四核处理器和活跃数据集是完全缓存,您将通过约35数据库连接漏斗的要求看那些2000的用户更好的性能。
要理解为什么这是真的,这个思想实验应该有所帮助。 考虑一个假设性的数据库服务器机器只有一个资源共享 - 单核。 这个核心将在没有开销的所有并发请求之间的时间片相等。 比方说,100名的请求都在同一时刻,每个都需要CPU时间1秒进来了。 核心适用于所有的人,时间切片中的他们,直到他们全部完成后100秒。 现在考虑,如果你把前面的连接池将接受100个的客户端连接,但在同一时间到数据库服务器做只有一个要求,把其同时连接忙成到达队列的任何请求会发生什么。 现在,当100个请求在同一时间到达,一个客户端获得以1秒的响应; 另一个获得2秒的响应,最后客户端获得在100秒的响应。 没人不得不等待更长的时间才能得到回应,吞吐量是相同的,但平均延迟50.5数秒之超过100秒。
一个真正的数据库服务器可以并行使用更多的资源,但同样的原则也适用,一旦被饱和,你只有通过增加更多的并发数据库请求伤害的事情。 它实际上是比的例子更糟糕,因为有更多的任务,你有更多的任务开关,门锁和高速缓存增加争,L2和L3高速缓存行的竞争,并切成吞吐量和时延等诸多问题。 最重要的是,虽然高work_mem
设置可以帮助多种方式查询,该设置是为每个连接每个规划节点的限制,所以有大量的连接,你需要离开这个非常小,以避免刷新缓存甚至导致交换,这将导致更慢的计划或这样的事情哈希表溢出到磁盘。
有些数据库产品有效地建立一个连接池到服务器,但PostgreSQL的社会已采取的立场是,因为最好的连接池更靠近客户端软件来完成,他们将它留给用户管理这一点。 大多数poolers会有一些办法来限制硬一些数据库的连接,同时允许比这更多并发客户端请求,根据需要排队它们。 这是你想要的,它应该事务的基础上进行,而不是每个语句或连接。
PgBouncer减少由作为其保持连接池的代理建立连接的延迟。 这可能会帮助,如果你开到Postgres的许多短期连接加速应用。 如果你只有少量的连接,你不会看到太多的胜利的。