在LINUX上运行了一个SOCKET服务程序,在某端口如4200监听客户端的SOCKET连接,收发消息;程序运行了几个月一直没出现问题,今天突然出现大量客户端建立SOCKET超时,用ps命令检查发现服务进程还在,没有退出,用netstat查看端口发现也是LISTENING状态;检查服务端日志文件,没有发现任何异常,但是已经有半小时没有收到任何客户端的连接请求了,而实际上这段时间有大量客户端在试图建立SOCKET连接;KILL掉服务端进程,重新启动后恢复正常;从日志看服务端主进程一直在运行,并有日志输出,而端口监听线程没有任何日志输出了,怀疑该线程已经死掉;
请各位指点出现这种情况的原因,或者有没有什么办法能监控到监听线程的状态,当出现问题时能及时给出提示,重新启动程序socket线程异常linuxkill

解决方案 »

  1.   

    这个时候客户端可以ping通主机吗?客户端可以telnet主机其他开放的端口吗?先确认一下是不是网络原因
      

  2.   

    如果不是程序问题,用top查看下系统memory和CPU,有时候memory不够的情况下会出现这样的问题。
      

  3.   

    看了的,没有问题的,是线程down了,重启服务就没有问题了,现在就是想能够监控他,让我们知道他是什么时候down的,不能等用户来反应吧,数据库时用的oracle
      

  4.   

    那一步步跟踪,看为什么down的。实在要监控,就写个程序每隔个5分钟给服务器连接下,连接不上的话就写个日志到文件中,主程序也每隔一段时间去读这个日志文件,如果有问题了,就提示终端用户。
      

  5.   

    那一步步跟踪,看为什么down的。实在要监控,就写个程序每隔个5分钟给服务器连接下,连接不上的话就写个日志到文件中,主程序也每隔一段时间去读这个日志文件,如果有问题了,就提示终端用户。这个方法我想到了的,现在是想看能不能有更好的方法,我先是在oracle数据库中通过查询session来判断服务是否正常,但是我又觉得这样麻烦
      

  6.   

    那一步步跟踪,看为什么down的。实在要监控,就写个程序每隔个5分钟给服务器连接下,连接不上的话就写个日志到文件中,主程序也每隔一段时间去读这个日志文件,如果有问题了,就提示终端用户。这个方法我想到了的,现在是想看能不能有更好的方法,我先是在oracle数据库中通过查询session来判断服务是否正常,但是我又觉得这样麻烦
    判断session没你这个想法来的简单
      

  7.   

    用lsof,可以查看打开的文件情况,因为socket连接也是作为文件,所以可以看到已经打开的连接数。
    然后grep tcp和端口什么的关键字,过滤一下
    看看同时连接到端口上有多少文件被打开,默认上线好像4万多。
    如果满了,看看状态都是啥,有time wait1,time wait2,final wait,这三种是不是很多。
    你去翻翻http协议的介绍,就知道都怎么回事了。
    final wait不用管,好像time wait 2会自动进入final wait,time wait1可能需要手工杀。netstat也可以替换lsof的,用法不一样。