在Django中,CONN_MAX_AGE的一个好的取值是多少?

75

2
0 没有意义.. 除非你明确需要,否则为什么要在请求完成后保持连接打开呢? - karthikr
45
创建连接是一项昂贵的操作。这可以让你避免在每个请求中都创建一个新的连接。 - aehlke
5
因为建立连接是很耗费资源的,你不希望在每次查询时都重新建立连接。这样非常低效。 - Saher Ahwal
2个回答

36

“让连接保持时间越长,数据流量就可以越大”这个说法并不是那么简单。

这还取决于你如何运行Django。

目前,在gunicorn+greenlet(evenlet或者gevent)上启动Django是比较流行的方式。如果你将CONN_MAX_AGE设置为60秒(甚至是在我的情况下设置为5秒),你可能会从DB服务器得到“连接过多”的投诉。

详情请参见:

https://github.com/benoitc/gunicorn/issues/996

https://serverfault.com/questions/635100/django-conn-max-age-persists-connections-but-doesnt-reuse-them-with-postgresq


我们决定通过pgpool-II服务器连接到postgres服务器,如果使用CONN_MAX_AGE != 0,则会很快出现痛苦的超时,特别是当您有足够的工作进程/线程时。 - kelvan
我曾经遇到过同样的问题,但是我切换到了gunicorn --worker-class uvicorn.workers.UvicornWorker,它可以正确地管理连接。 - Alexander

34

这个值取决于你的网站流量,流量越大保持连接的时间就越长。我建议设置一个相对较小的值,例如 60,然后根据使用模式进行调整。



编辑(2018):

正如@jcyrss所指出的,这种方法有其缺陷,未来建议将连接池分配给类似pgbouncer的东西。


您是在暗示启用pgbouncer后,就不应该在设置中设置CONN_MAX_AGE吗? - Hassan Baig
@HassanBaig 当你安装了pgbouncer之后,从Django中进行连接池的操作就没有什么意义了。 - MGP
1
对于Django 3.2,在事务池模式下使用连接池器(例如PgBouncer)需要禁用该连接的服务器端游标。如果所有迭代器代码都必须更改,我认为使用pgbouncer并不容易。 - Benny Chan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接