公司的缓存系统这几天出现问题,连接数超出限制的2048,导致应用不能继续工作,我们需要确定是哪一台应用服务器上的哪个进程的连接数较多,假设缓存服务器的端口号为11111,IP地址已用字母代替,具体方法如下:
1.找出应用服务器连接缓存服务器的连接数
#netstat –an |grep 11111 在缓存服务器上查看各应用服务器的连接数,确定IP为xx.xx.xx.xa的应用连接最多
2.找出连接缓存服务器的应用系统的端口号
#netstat –an |grep11111 在应用服务器上查找连接缓存服务器的应用端口号
tcp 0 0 xx.xx.xx.xa.52878 xx.xx.xx.xb.11111 ESTABLISHED
tcp 0 0 xx.xx.xx.xa.52968 xx.xx.xx.xb.11111 ESTABLISHED
tcp 0 0 xx.xx.xx.xa.52952 xx.xx.xx.xb.11111 ESTABLISHED
tcp 0 0 xx.xx.xx.xa.52876 xx.xx.xx.xb.11111 ESTABLISHED
tcp 0 0 xx.xx.xx.xa.52852 xx.xx.xx.xb.11111 ESTABLISHED
……
连接缓存系统的端口号为52878,52968,52962,52876,52852,……,这些端口号非常多,有几千条记录。
#netstat –an |grep 11111 |awk ‘{print $4}’ >/tmp/netlog.txt 抽取出这些端口号
xx.xx.xx.xa.52878
xx.xx.xx.xa.52968
xx.xx.xx.xa.52952
xx.xx.xx.xa.52876
xx.xx.xx.xa.52852
……
#vi /tmp/netlog.txt 使用vi编辑器打开/tmp/netlog.txt文件,删除IP地址
:1,$ s/^.\{12\}//g 非编辑模式下输入,前面12个字符的IP使用空格替换
编辑完成后netlog.txt文件就只剩下端口号了。
3.找出端口号对应的进程和实例
#vi /tmp/netlog.sh 逐行扫描netlog.txt文件的端口号,并执行lsof命令
for line in $(cat /tmp/netlog.txt)
do
lsof –F p -i:${line}
done
#/tmp/netlog.sh > /tmp/netout.txt 执行该脚本文件,并输出。
#cat /tmp/netout.txt 查看该文件,找到端口对应的进程号
P2997
P2997
P2997
P1887
P2997
……
2997和1887就是进程号,2997出现频率较高,该进程连接缓存服务器数量较多。
#ps–ef |grep 2997 查看该进程对应的程序或实例
4.验证
#kill-9 2997 杀掉该进程,验证连接数是否下降,确定连接数数量下降非常多