2023-05-16 11:26:08 8阅读
之前分享了一篇如何提高django的并发能力文章,文章的最后结论是采用gunicorn+gthread+django的方式来提高并发能力,该方法简单的说是利用的多线程。
文章也抛出了一个问题:gunicorn+gevent+django+CONN_MAX_AGE会导致数据库连接数飙升,直至占满。如果一定要利用协程的方式启动,该怎么解决这个问题呢?看了一下django源码,找到了问题的根源,写了一下解决办法,下边分享一下。
还是利用上一篇文章如何提高django的并发能力的数据模型,这次以get一条数据为例,由于某些原因(好吧手里没有资源),采用了配置稍低的机器:
1 |
DATABASES = { |
启动: gunicorn –env DJANGO_SETTINGS_MODULE=test_dj21.settings test_dj21.wsgi:application -w 8 -b 0.0.0.0:8080 -k gevent –max-requests 40960 –max-requests-jitter 5120
数据库连接数展示
qps展示
为什么能达到1000多, 因为一直再查同一条数据。
1 |
# django/db/backends/mysql/base.py |
还有一处诡异的代码
1 |
class BaseDatabaseWrapper: |
经过上边的代码,django关于mysql的部分没有使用连接池,导致每次数据库操作都要新建新的连接。更让我有些蒙的是,按照django的文档CONN_MAX_AGE是为了复用连接,但是为什么每次都要新建连接呢?。而且最难受的是一旦我们设置了CONN_MAX_AGE,连接并不会被close掉,而是一直在那占着。
也许是我使用的问题,出现了这个问题。不管如何,最后想了解决办法,请往下看
settings代码
1 |
DATABASES = { |
test_dj21.db.backends.mysql所在位置
base.py
1 |
import random |
数据库连接数展示
qps展示
如果没有self.connects[index].ping()操作压测性能会更好,但是不建议去掉,需要检查连接是否可用。
利用连接池+假关闭的方式解决过高连接数的问题,如果有更好的建议,可以讨论。
2023-05-16 11:26:08 8阅读
之前分享了一篇如何提高django的并发能力文章,文章的最后结论是采用gunicorn+gthread+django的方式来提高并发能力,该方法简单的说是利用的多线程。
文章也抛出了一个问题:gunicorn+gevent+django+CONN_MAX_AGE会导致数据库连接数飙升,直至占满。如果一定要利用协程的方式启动,该怎么解决这个问题呢?看了一下django源码,找到了问题的根源,写了一下解决办法,下边分享一下。
还是利用上一篇文章如何提高django的并发能力的数据模型,这次以get一条数据为例,由于某些原因(好吧手里没有资源),采用了配置稍低的机器:
1 |
DATABASES = { |
启动: gunicorn –env DJANGO_SETTINGS_MODULE=test_dj21.settings test_dj21.wsgi:application -w 8 -b 0.0.0.0:8080 -k gevent –max-requests 40960 –max-requests-jitter 5120
数据库连接数展示
qps展示
为什么能达到1000多, 因为一直再查同一条数据。
1 |
# django/db/backends/mysql/base.py |
还有一处诡异的代码
1 |
class BaseDatabaseWrapper: |
经过上边的代码,django关于mysql的部分没有使用连接池,导致每次数据库操作都要新建新的连接。更让我有些蒙的是,按照django的文档CONN_MAX_AGE是为了复用连接,但是为什么每次都要新建连接呢?。而且最难受的是一旦我们设置了CONN_MAX_AGE,连接并不会被close掉,而是一直在那占着。
也许是我使用的问题,出现了这个问题。不管如何,最后想了解决办法,请往下看
settings代码
1 |
DATABASES = { |
test_dj21.db.backends.mysql所在位置
base.py
1 |
import random |
数据库连接数展示
qps展示
如果没有self.connects[index].ping()操作压测性能会更好,但是不建议去掉,需要检查连接是否可用。
利用连接池+假关闭的方式解决过高连接数的问题,如果有更好的建议,可以讨论。