장고 : CONN_MAX_AGE는 연결을 유지하지만 PostgreSQL과 함께 재사용하지는 않습니다.


17

우분투 14.04 LTS에서 Django 1.6.7 및 Postgres 9.3을 사용하는 장고 설정이 있습니다.

어떤 시점에서든 사이트는 2.5GHz의 쿼드 코어 제온 E5-2670이며 16GB의 램을 갖춘 PostgreSQL 데이터베이스에 약 250 개의 동시 연결을 제공합니다. 하루 종일 특정 기계의로드 평균은 약 20-30입니다.

때때로 데이터베이스에 연결 시간이 초과되었다는 이메일을 보초로 보내 게되며 일종의 연결 풀링을 사용하면이 문제를 완화하는 데 도움이 될뿐만 아니라 데이터베이스의로드를 약간 줄일 수 있습니다.

Django 1.6을 사용하고 있기 때문에 우리는 내장 풀링을 사용할 수 있습니다. 그러나 CONN_MAX_AGE를 10 초 또는 60 초로 설정하면 거의 동시에 동시 연결 수가 허용되는 최대 설정 (일반적으로 볼 수있는 것의 약 두 배)으로 이동하고 연결이 거부되기 시작합니다.

그래서, 그것은 이제까지 이유, 연결이 무엇을 표시 하고 있습니다 지속,하지만 그들은 되지 않습니다 재사용된다.

이것의 원인은 무엇입니까?

추신. 또한 --worker-class = eventlet과 함께 gunicorn을 사용하고 있습니다. 아마도 이것이 우리의 재앙의 근원일까요?

답변:


18

좀 더 실험 해 본 결과 문제의 원인이 실제로 gunicorn의 eventlet worker 클래스라는 것을 알았습니다. 각 마이크로 스레드는 고유 한 영구 연결을 만들었으며 전혀 재사용 할 방법이 없었습니다.

eventlet을 비활성화하면 웹 서버의 부하가 증가했지만 그다지 많지는 않지만 postgres의 부하는 평균 3에서 30으로 줄었습니다.


2
방금 우리를 엄청나게 절약했습니다! 우리는 정확히 같은 행동을 관찰하고 eventlet을 사용하고 있습니다. 연결 풀링으로 전환하여 작동 방식을 확인합니다.
silentser

3
업데이트 : pgBouncer로 데이터베이스 연결 풀링으로 문제를 해결하는 것처럼 보였습니다 (여전히 eventlet을 사용하고 있습니다)
silentser

분명히도 psycogreen 것 : pypi.python.org/pypi/psycogreen/1.0 (I 0으로 CONN_MAX_AGE를 설정하면 나는 그것을 시도하지했습니다 그것은 우리가 단순히 풀링을 필요가 없습니다 있도록 DB 연결을 만들기 위해 우리의 시스템이 20ms 소요)
Darren

1
우리가 겪었던 것과 똑같은 문제에 대한 답을 밝혀내는 데 약간의 시간이 걸렸습니다.
Alper
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.