Django持久数据库连接

Har*_*ons 54 python database django mod-wsgi persistent

我正在使用django和apache以及mod_wsgi和PostgreSQL(都在同一主机上),我需要处理很多简单的动态页面请求(每秒数百个).我遇到的问题是瓶颈是django没有持久的数据库连接并且在每个请求上重新连接(需要接近5ms).在进行基准测试时,我得到了持久连接,我可以处理接近500 r/s而没有我只得到50 r/s.

有人有什么建议吗?如何修改django以使用持久连接?或者加速从python到DB的连接

提前致谢.

Ces*_*ssa 30

Django 1.6添加了持久连接支持(链接到django 1.9的doc):

持久连接避免了在每个请求中重新建立与数据库的连接的开销.它们由CONN_MAX_AGE参数控制,该参数定义连接的最长生命周期.可以为每个数据库单独设置.

  • 这是1.6分支中的(第一个)提交:https://github.com/django/django/commit/2ee21d9f0d9eaed0494f3b9cd4b5bc9beffffae5 (2认同)

小智 22

试试PgBouncer - PostgreSQL的轻量级连接池.特征:

  • 旋转连接时的几个级别的残暴:
    • 会话池
    • 交易池
    • 声明池
  • 内存要求低(默认情况下每个连接2k).

  • @Mike TK首先,它与pgpool不同.Pgbouncer与libevent一起工作,并且异步管理连接,而不是像Postgres本身那样为pgpool分配每个连接的进程(唯一的区别是pgpool使进程保持活动状态).根据我使用pgbouncer的经验(与不使用任何方法相比)给出了明显的加速. (4认同)
  • +1.这是他们在Disqus上使用的(迄今为止,具有最大用户群的Django项目).我认为这是经过防火测试的. (4认同)

Gle*_*ard 20

在Django trunk中,编辑django/db/__init__.py并注释掉该行:

signals.request_finished.connect(close_connection)
Run Code Online (Sandbox Code Playgroud)

此信号处理程序使其在每次请求后都与数据库断开连接.我不知道这样做的所有副作用是什么,但是在每个请求之后启动新连接没有任何意义; 正如你所注意到的那样,它会摧毁你的表现.

我现在正在使用它,但我没有做过全套测试,看看是否有任何问题.

我不知道为什么每个人都认为这需要一个新的后端或一个特殊的连接pooler或其他复杂的解决方案.这似乎很简单,虽然我不怀疑有一些模糊不清的问题让他们首先这样做 - 应该更明智地处理; 正如您所注意到的,对于高性能服务而言,每个请求的5ms开销是相当多的.(我花了150毫秒 - 我还没弄明白为什么.)

编辑:另一个必要的变化是在django/middleware/transaction.py; 删除两个transaction.is_dirty()测试并始终调用commit()或rollback().否则,如果它只从数据库中读取,它将不提交事务,这将使应该关闭的锁打开.

  • 有关此更常见的实现,请参阅http://groups.google.com/group/django-users/browse_thread/thread/9b58de1380b1afd0 django-postgres-persistent-db-connection.diff,但它仅适用于Postgresql.(并不是说OP甚至在听,但对于那些在这里找到他们的人来说......) (5认同)

Igo*_*son 15

我创建了一个小的Django补丁,通过sqlalchemy池实现MySQL和PostgreSQL的连接池.

这在很长一段时间内完美地适用于http://grandcapital.net/的制作.

这个补丁是在谷歌搜索了一下之后编写的.