Opened 5 years ago

Last modified 5 years ago

#31373 closed Bug

Django 3.x / uwsgi is leaking connections — at Version 9

Reported by: Marcin Nowak Owned by: nobody
Component: Database layer (models, ORM) Version: 3.0
Severity: Release blocker Keywords:
Cc: Andrew Godwin, Simon Charette Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Marcin Nowak)

Project upgraded from 2.x to 3.0.4 is leaking PostgreSQL database connections.
ATOMIC_REQUESTS=False, AUTOCOMMIT=True, CONN_MAX_AGE=0
UWSGi threads are enabled (--enable-threads)
Python 3.8.1 and 3.7.3

After few hours all posgtress connections are used (too many connections error).
pg_stat_activity is reporting idle connections with part of queries visible.



Facts:

  • setting up CONN_MAX_AGE > 0 does not help
  • CONN_MAX_AGE = 30, starting runserver and making many calls with ab -c 10 -n 100 http://127.0.0.1:8000/ uses all available connections and ends with error 500 (due to no available connections)
  • CONN_MAX_AGE = 30, starting runserver --nothreading and making calls with ab -c 100 -n 100 http://127.0.0.1:8000/ works fine
  • CONN_MAX_AGE=30 + runserver + ab scenario is reproducible on clean install. Called view must access database.
  • CONN_MAX_AGE=0 + runserver + ab -> cannot reproduce.
  • Django 2.x has similar issue for CONN_MAX_AGE=30, but can reuse connections (still there are several errors on high traffic, but app server can "recover" and handle bunch of incoming requests)
  • Looks like Django 3.x cannot reuse connections
  • uwsgi + threads + CONN_MAX_AGE=0 on localhost -> cannot reproduce

Runserver (with threads) test results:

ab -c 10 -n 200 Django 3.0.4:
Complete requests: 200
Failed requests: 108

ab -c 10 -n 1000 Django 2.2.11:
Complete requests: 1000
Failed requests: 37


There may be two separate cases:

  1. not reusing connection when CONN_MAX_AGE is greater than 0
  2. leaking (not closing?) connections on uwsgi (?) with enabled threads (?) and CONN_MAX_AGE set to 0

I'm not sure about the 2nd case.

Change History (11)

comment:1 by Marcin Nowak, 5 years ago

Description: modified (diff)

comment:2 by Marcin Nowak, 5 years ago

Description: modified (diff)

comment:3 by Marcin Nowak, 5 years ago

Description: modified (diff)

comment:4 by Marcin Nowak, 5 years ago

Description: modified (diff)

comment:5 by Marcin Nowak, 5 years ago

Description: modified (diff)

comment:6 by Marcin Nowak, 5 years ago

Description: modified (diff)

comment:7 by Marcin Nowak, 5 years ago

Description: modified (diff)

comment:8 by Marcin Nowak, 5 years ago

Description: modified (diff)

comment:9 by Marcin Nowak, 5 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top