Django + Postgres FATAL: извините, слишком много клиентов уже - PullRequest
1 голос
/ 25 марта 2020

Время от времени я получаю «ФАТАЛЬНО: извините, слишком много клиентов», потому что в Postgres у меня много незанятых соединений, и я не могу понять, откуда они приходят и как их предотвратить.

Сначала я попробовал настройку CONN_MAX_AGE в Django, но, похоже, она не действует.

Я также установил idle_in_transaction_session_timeout до 5 минут за Postgres, но я продолжаю видеть множество бездействующих транзакций:

postgres=# select client_addr, state, count(*) from pg_stat_activity group by client_addr, state;
  client_addr  | state  | count 
---------------+--------+-------
               |        |     5
               | active |     1
               | idle   |     1
 172.30.12.148 | idle   |     2
 172.30.12.74  | idle   |    89
(5 rows)
postgres=# select client_addr, state, backend_start, query_start from pg_stat_activity order by query_start ;
  client_addr  | state  |         backend_start         |          query_start          
---------------+--------+-------------------------------+-------------------------------
               | idle   | 2020-03-24 20:03:16.060707+00 | 2020-03-24 20:55:17.020962+00
 172.30.12.74  | idle   | 2020-03-25 02:05:32.567976+00 | 2020-03-25 02:05:32.613112+00
 172.30.12.74  | idle   | 2020-03-25 02:05:34.926656+00 | 2020-03-25 02:05:34.945405+00
 172.30.12.74  | idle   | 2020-03-25 02:05:49.700201+00 | 2020-03-25 02:05:49.717165+00
[...]
 172.30.12.74  | idle   | 2020-03-25 04:00:51.019892+00 | 2020-03-25 04:01:22.627659+00
 172.30.12.74  | idle   | 2020-03-25 04:04:18.333413+00 | 2020-03-25 04:04:18.350539+00
 172.30.12.74  | idle   | 2020-03-25 04:04:35.157547+00 | 2020-03-25 04:05:16.746978+00
 172.30.12.74  | idle   | 2020-03-25 04:05:08.241291+00 | 2020-03-25 04:05:39.367247+00
 172.30.12.148 | idle   | 2020-03-25 04:07:02.717151+00 | 2020-03-25 04:07:02.726822+00
 172.30.12.74  | idle   | 2020-03-25 04:07:48.07922+00  | 2020-03-25 04:07:48.112819+00
               | active | 2020-03-25 04:00:10.608213+00 | 2020-03-25 04:07:57.336091+00
               |        | 2020-03-24 19:40:38.624442+00 | 
               |        | 2020-03-24 19:40:38.624876+00 | 
               |        | 2020-03-24 19:40:38.624003+00 | 
               |        | 2020-03-24 19:40:38.623479+00 | 
               |        | 2020-03-24 19:40:38.62598+00  | 
(99 rows)

Я понимаю, что Django поддерживает одно соединение на поток, но (если я могу поверить, что этот фрагмент ) У меня только один:

root@omaha-server-public-565447b47c-c2nqh:/usr/src/app# python manage.py shell        
Python 3.7.1 (default, Nov 16 2018, 22:26:09) 
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import threading
>>> for thread in threading.enumerate(): print(thread.name)
... 
MainThread
>>> 

Так почему, когда я перечисляю соединения с моей БД (работающей на 10.100.59.225), я вижу так много УСТАНОВЛЕННЫХ соединений?

root@omaha-server-public-565447b47c-c2nqh:/usr/src/app# netstat -natup | grep  10.100.59.225 | wc -l
89

Я плохо знакомы с Django, Python и Postgres, так что, думаю, я упустил что-то очевидное, но мои поиски пока не принесли ничего полезного, поэтому я пытаюсь здесь :-)

Информация о версии:

  • Django 2.2
    • django -cacheops 4.1
    • psycopg2 2.7.3.2
  • Postgres 12.2
  • Python 3.7.1

1 Ответ

1 голос
/ 25 марта 2020

На самом деле у вас больше незанятых сессий, чем незанятых транзакций в незанятых сессиях: это похоже на возможную утечку соединения на стороне приложения. PostgreSQL не имеет тайм-аута для неактивных сеансов, в которых не выполняется ни одна транзакция. Возможный обходной путь на стороне PostgreSQL состоит в том, чтобы запланировать задание на уничтожение этих бездействующих сеансов: см. Есть ли тайм-аут для неактивных PostgreSQL соединений?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...