Postgresql 生成了大量的 postmaster 进程

Postgresql 生成了大量的 postmaster 进程

由于某种原因,postgres 生成了 700 多个 postmaster 进程来处理数据库请求,并且 postgres 日志文件中充满了“客户端连接上出现意外的 EOF”、“启动数据包不完整”和“抱歉,客户端太多了”。netstat 告诉我所有打开的连接都是本地的,我很确定它们来自 postgres 内部。这个特定实例在过去 230 天左右一直运行良好,配置方面没有任何变化。关于我应该去哪里尝试解决这个问题,您有什么想法吗?

这是我第一次诊断这样的问题,因此如果我可以采取任何步骤来帮助缩小原因范围,这也会有所帮助。

更新:事实证明,远程机器上正在运行一个 tomcat 实例,它试图通过 ssh 隧道连接到 postgres,从而导致一切都失控。

答案1

Postgres 为每个连接生成一个 postmaster。这是它应该的工作方式。如果您生成了大量的 postmaster 进程,那么您就会启动大量连接,如果这不是您所期望的,那么您的应用程序可能损坏/行为不良,造成混乱(一个常见的例子:一个不断重新初始化 DB 连接但从不关闭它的应用程序。每次连接初始化都会泄漏一个会话)。

如果这是最近发生的,请从“发生了什么变化?”开始。如果不是,请开始查看所有与 Postgres 对话的应用程序(大致按使用量排序),看看是否能找到坏苹果。

回复:您的日志消息——

  • unexpected EOF on client connection
    某些原因导致已建立的 Postgres 连接未正确关闭就终止(postmaster 可能会停留一段时间来清理由此产生的混乱)。找出导致连接终止的原因(启动它的进程是否崩溃?应用程序是否编写不当并在清理其数据库句柄之前退出?)以及修理它

  • incomplete startup packet
    某些东西连接到 Postgres 并且没有发起正确的 Postgres 握手/启动。通常,生成的 postmaster 会在几秒钟内消失。
    查找导致此问题的原因并修理它(这可能是您的监控系统、正在对您的网络进行端口扫描的人、或某个地方编写糟糕的应用程序)

  • sorry, too many clients already
    我认为这一点是不言自明的。修复上述问题,它可能会消失,否则请考虑增加ax_connectionsm postgresql.conf

相关内容