我正在处理一个安装了PostgreSQL 11.2的系统,它定期在其系统日志中抱怨
FATAL: sorry, too many clients already
despite being no-where close to its configured limit of connections. This query:
SELECT current_setting('max_connections') AS max,
COUNT(*) AS total
FROM pg_stat_activity
告诉我,数据库被配置为最多100个连接。 我从来没有见过超过45个连接到数据库的这种查询,甚至在运行的程序收到数据库错误的时刻,说有太多的客户支持,在Postgres日志中的上述信息。
我在互联网上能找到的关于这个问题的绝对一切都表明,这个错误意味着你已经超过了max_connections
的设置,但数据库本身告诉我,我没有。
值得一提的是,pyspark是唯一一个触发这个错误的数据库客户端,而且只在它从数据帧写入表的时候。 使用psycopg2
的普通python代码(也就是主要的客户端)从未触发过这个错误(甚至在以同样的方式从Pandas数据帧写入表时也没有),像pgAdmin这样的管理工具也从未触发过。 如果我没有在数据库日志中直接看到这个错误,我会认为Spark在错误上对我撒谎。 大多数情况下,如果我使用这样的查询。
SELECT pg_terminate_backend(pid) FROM pg_stat_activity
WHERE pid <> pg_backend_pid() AND application_name LIKE 'pgAdmin%';
然后这个问题就会消失好几天。 但就像我说的,根据数据库本身,我从来没有见过所谓的最大100个连接中的50%在使用。 我怎样才能找出导致这个错误的原因?