公司的缓存系统这几天出现问题,连接数超出限制的2048,导致应用不能继续工作,我们需要确定是哪一台应用服务器上的哪个进程的连接数较多,假设缓存服务器的端口号为11111IP地址已用字母代替,具体方法如下:

1.找出应用服务器连接缓存服务器的连接数

 #netstat –an |grep 11111       缓存服务器上查看各应用服务器的连接数,确定IPxx.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

……

连接缓存系统的端口号为5287852968529625287652852……,这些端口号非常多,有几千条记录。

#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

……

29971887就是进程号,2997出现频率较高,该进程连接缓存服务器数量较多。

#ps–ef |grep 2997     查看该进程对应的程序或实例

4.验证

#kill-9 2997          杀掉该进程,验证连接数是否下降,确定连接数数量下降非常多