起因:公司测试人员发现交易端账号登陆不上,管理端账号一直显示连接中(这个问题最近一周偶尔发现过)
查看对应日志并没有什么报错,经过排查发现ts这边的日志显示没有连接上broker,对应账号平台端口没有监听。
现象:
netstat 加上-p选项后,有部分端口没有显示占用该端口的pid和进程名,而以“-”代替。如图。
分析原因:
这台服务器已经开机一百多天了,ts通过pid连接broker,监听过程中,端口就不知不觉没有了账号就一直登录中了。
由于每天8点和20点两次重启脚本会杀死服务然后创建新的服务进程,Linux分配的进程连接的socket id会逐渐增大。当服务器运行较长的一段时间,期间没有进行断电重启时,这个socket id将会超过 INT_MAX (即2^31)。而netstat的源代码中对socket id大于INT_MAX的进程不予处理。
问题处理:
应急处理:reboot下机器 使socket id重新刷新
永久方法:
使用git上作者提供的patch,对源码进行重新编译打包。已提供rpm包:net-tools-1.60.20120726git-rzrk_1.x86_64.rpm
升级方式:
执行:rpm -Uvh net-tools-1.60.20120726git-rzrk_1.x86_64.rpm
升级后的效果如下图。
【附加说明】
这个rpm包可以放在soft包中,和其他rpm包同一个目录,在部署系统时随其他rpm包一起安装。
单机模式和主备机模式部署时作为可选项,自行决定是否升级。
分布式模式部署时必须升级net-tools,因为系统监控页面中的进程端口就是通过netstat命令获取的。上述的bug将导致分布式系统监控某些XT服务时显示端口为0。