Oracle GoldenGate 长期运行后, ggsci 会频繁报告 Too many open files 错误。
lsof(list open files)是普渡大学开发的UNIX平台工具,用于列出所有打开的文件。由于UNIX的哲学是一切皆文件,因此,不仅仅标准的文件,网络连接、硬件设备等都可以通过lsof来查询。
lsof工具在AIX上可以通过AIX Web Download Pack Programs获取,与此相同的还有其他一些开源工具如OpenSSH、openssl等。其网址如下:
https://www14.software.ibm.com/webapp/iwm/web/preLogin.do?source=aixbp
工具以文件集fileset方式组织,使用smitty install方式安装即可(需要Accept New license)。
跟踪 ggsci 进程发现,该 OGG 进程有大量 TCP 连接处于 CLOSED 状态:
/tmp/lsof/lsof_4.891# lsof -p 41945024
。。。 部分省略
ggsci 41945024 oracle 4u IPv6 0xf1000e00a382fbb8 0t0 TCP *:* (CLOSED)
ggsci 41945024 oracle 5u IPv6 0xf1000e0055e463b8 0t0 TCP *:* (CLOSED)
ggsci 41945024 oracle 6u IPv6 0xf1000e002e68b3b8 0t0 TCP *:* (CLOSED)
。。。部分省略
ggsci 41945024 oracle 72u IPv6 0xf1000e00a18aabb8 0t0 TCP *:* (CLOSED)
ggsci 41945024 oracle 73u IPv6 0xf1000e009a1163b8 0t0 TCP *:* (CLOSED)
ggsci 41945024 oracle 74u IPv6 0xf1000e00a1a57bb8 0t0 TCP *:* (CLOSED)
ggsci 41945024 oracle 75u IPv6 0xf1000e00b72afbb8 0t0 TCP *:7771 (LISTEN)
。。。
从系统层面统计看,已经存在 9464 个 TCP 连接处于 CLOSED 状态,而且这些连接均属于 OGG :
/tmp/lsof/lsof_4.891# netstat -Aan|grep CLOSED|wc -l
9464
:/tmp/lsof/lsof_4.891# netstat -Aan|grep CLOSED|pg
。。。
f1000e00bcbd43b8 tcp 0 0 *.* *.* CLOSED
。。。
/tmp/lsof/lsof_4.891# rmsock f1000e00bcbd43b8 tcpcb
The socket 0xf1000e00bcbd4008 is being held by proccess 6293238 ( ggsci ).
参考TCP 协议规范, CLOSED 状态不是一个真正的状态,而是TCP 状态变迁的假想起点和终点。经过确认,日志中 OGG 进程所处的 ”TCP : (CLOSED)”状态为起点状态;即 ggsci 进程调用了 socket 接口创建相应的文件句柄,调用形式例如 socket( AF_INET,SOCK_STREAM, 0 ) ,但没有后续 connect 建立连接,或 listen 监听操作,也没有 close 释放操作。
说明:
没有 OGG 运行的环境中通常不会看到大量 TCP 连接处于 CLOSED 状态。作为对比, OGG 环境中存在上万 TCP 连接处于 CLOSED 状态。
从目前掌握的数据看, OGG 进程存在较大量的未使用的 socket 句柄( 当前环境已经存在 9464 个未使用 socket 句柄 ),没有进行后续 listen/connect 动作,也没有 close 释放相应的 socket 句柄资源。
这很可能导致了 OGG 文件句柄资源泄露,长期累积可能造成句柄资源耗尽,引发 too many open files 报错。
经过沟通,客户确认与 OGG Director 功能有关,停止该服务后 kernel 降低到个位数,泄露句柄数也从一万左右下降到个位数。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞0
添加新评论0 条评论