Время от времени я получаю «ФАТАЛЬНО: извините, слишком много клиентов», потому что в 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