charleschchen
作者charleschchen·2022-11-04 00:09
系统架构师·浪潮商用机器有限公司

TCP端口冲突问题分析

字数 3509阅读 1238评论 0赞 0

问题现象

客户反馈安装Oracle 19c数据库以后,应用程序无法启动,报错提示:
Address already in use.

问题分析

根据提示判断报错是应用端口被占用造成。跟踪应用程序执行过程,并与客户确认可知,应用使用端口为9002。接下来需要确认9002端口为何种应用程序所占用,这可以使用lsof/rmsock/kdb等多种工具来判断,此处使用lsof进行了确认。lsof的安装方法可以参考:
https://www.talkwithtrend.com/Article/256795

#lsof -n -P -i :9002  
lsof: WARNING: compiled for AIX version 6.1.0.0; this is 7.2.0.0.  
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME  
snmpdv3ne 5505458 root 7u IPv6 0xf100100000165bb8 0t0 TCP *:9002 (LISTEN)  

#lsof -n -P -p 5505458  
lsof: WARNING: compiled for AIX version 6.1.0.0; this is 7.2.0.0.  
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME  
snmpdv3ne 5505458 root cwd VDIR 10,4 4096 2 / (/dev/hd4)  
snmpdv3ne 5505458 root 0u unix 10,4 0t0 12293 /dev/.SRC-unix/SRC0000590202uIcqed  
snmpdv3ne 5505458 root 1w VMPC 4,0 0t0 4189 /dev/console/0  
snmpdv3ne 5505458 root 2w VMPC 4,0 0t0 4189 /dev/console/0  
snmpdv3ne 5505458 root 3r VREG 10,4 10200 379 / (/dev/hd4)  
snmpdv3ne 5505458 root 4r VREG 10,5 21056 58118 /usr (/dev/hd2)  
snmpdv3ne 5505458 root 5r VREG 10,4 10200 379 / (/dev/hd4)  
snmpdv3ne 5505458 root 6u IPv6 0xf100100000160200 0t0 UDP *:161  
snmpdv3ne 5505458 root 7u IPv6 0xf100100000165bb8 0t0 TCP *:9002 (LISTEN)  
snmpdv3ne 5505458 root 8u unix 10,7 0t0 10 /tmp/dpi_socket  
snmpdv3ne 5505458 root 9u IPv6 0xf1001000001653b8 0t0 TCP *:199 (LISTEN)  

可以判断9002端口号为SNMP服务占用,其进程id为5505458。检查SNMP daemon进程打开文件句柄可以看到,除了默认的知名端口号161,SNMP也在私有端口9002上进行监听。9002应该是来自临时分配的端口号。

AIX环境的临时端口范围由no网络参数tcp_ephemeral_low、tcp_ephemeral_high界定。

#no -L tcp_ephemeral_low  
--------------------------------------------------------------------------------  
NAME CUR DEF BOOT MIN MAX UNIT TYPE  
DEPENDENCIES  
--------------------------------------------------------------------------------  
tcp_ephemeral_low 9000 32K 9000 1K 65534 numeric D  
tcp_ephemeral_high  
--------------------------------------------------------------------------------  

可以看到,tcp_ephemeral_low由默认的32768改为了9000,这应当是SNMP占用9002端口的直接原因。

检查Oracle Installation Guide for AIX,可以看到:
https://docs.oracle.com/en/database/oracle/oracle-database/19/axdbi/setting-udp-and-tcp-kernel-parameters-manually.html#GUID-95D08EE7-7C40-44CB-8973-F8A31569FB2E
文档中建议了对tcp_ephemeral_low、tcp_ephemeral_high进行修改以应对高并发查询或节点数量较多的场景。

但很明显此处的修改触发了与应用的冲突,因此需要将tcp_ephemeral_low适当提高.

解决方案

将tcp_ephemeral_low由9000提高到9100,重启SNMP服务,问题解决。

#no -p -o tcp_ephemeral_low=9100  
Setting tcp_ephemeral_low to 9100  
Setting tcp_ephemeral_low to 9100 in nextboot file  

#stopsrc -s snmpd  
0513-044 The snmpd Subsystem was requested to stop.  
#startsrc -s snmpd  
0513-059 The snmpd Subsystem has been started. Subsystem PID is 33882370.  

#lsof -n -P -p 5964230  
lsof: WARNING: compiled for AIX version 6.1.0.0; this is 7.2.0.0.  
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME  
snmpdv3ne 5964230 root cwd VDIR 10,4 4096 2 / (/dev/hd4)  
snmpdv3ne 5964230 root 0u unix 10,4 0t0 12290 /dev/.SRC-unix/SRC0006291946_Eyaed  
snmpdv3ne 5964230 root 1w VMPC 4,0 0t0 4189 /dev/console/0  
snmpdv3ne 5964230 root 2w VMPC 4,0 0t0 4189 /dev/console/0  
snmpdv3ne 5964230 root 3r VREG 10,4 10200 379 / (/dev/hd4)  
snmpdv3ne 5964230 root 4r VREG 10,5 21056 58118 /usr (/dev/hd2)  
snmpdv3ne 5964230 root 5r VREG 10,4 10200 379 / (/dev/hd4)  
snmpdv3ne 5964230 root 6u IPv6 0xf100100000b62400 0t0 UDP *:161  
snmpdv3ne 5964230 root 7u IPv6 0xf100100000b673b8 0t0 TCP *:9102 (LISTEN)  
snmpdv3ne 5964230 root 8u unix 10,7 0t0 10 /tmp/dpi_socket  
snmpdv3ne 5964230 root 9u IPv6 0xf100100000b67bb8 0t0 TCP *:199 (LISTEN)

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

X社区推广