已建立的 Linux 进程



我们正在运行一个IBM MDM服务器(initiate),它通过池化机制连接到Oracle DB服务器。池的配置已设置为 32。我们还有一个自定义的 Java 进程,通过 MDM 服务器公开的 API 将数据提交到此 MDM 服务器。一旦我们的自定义 Java 进程(不直接打开任何数据库连接)终止,我们看到 MDM 服务器和 Db 服务器之间的进程数已增加到大于 32 的某个数字。每次夜间运行后,我们看到进程数不断增加,最终达到了 Oracle DB (700) 设置的限制,并且数据库不会允许再向其打开任何连接,并且我们的进程在那天晚上失败。我们试图弄清楚为什么进程没有被终止,为什么它们仍然处于建立模式(根据 netstat 命令)

进程数可能增加和套接字处于"已建立"状态有几个原因。

典型的错误是为每个消息/连接/注册生成一个子进程,而不是重用现有连接。特别是涉及计时器回调

例如,

c - register for timer callback -> server
c -> spawn a process to receive the reply and listen on receive socket
c - register for timer callback -> server -> server
c -> spawn a process to receive the reply and listen on receive socket

相反,它应该是

c - register for timer callback -> server
c -> spawn a process to receive the reply and listen on receive socket
c - set the initialized flag
c - register for timer callback -> server
c -> if initialized do not spawn a process to receive the reply

达到最大限制后系统是否出现任何异常?

创建的进程是否仍然有效?

这些进程是否建立了数据库连接但未终止?

顶部输出是否显示活动进程?

1)清除旧日志。2) LSOF 数据。这是一个操作系统命令,它将告诉我们 应用服务器进程正在使用哪些描述符。 lsof -p PID> lsof.out3)限制。这些是操作系统资源限制 ulimit -a> ulimits.out

请检查打开连接的代码在使用后是否关闭?

检查 lsof 输出和连接类型的状态?

我在IBM担任Java服务工程师。请回答上述问题,以便我们为您提供更好的帮助。

最新更新