当前位置:编程学习 > JAVA >>

服务端socket监控,求大牛!!

在LINUX上运行了一个SOCKET服务程序,在某端口如4200监听客户端的SOCKET连接,收发消息;程序运行了几个月一直没出现问题,今天突然出现大量客户端建立SOCKET超时,用ps命令检查发现服务进程还在,没有退出,用netstat查看端口发现也是LISTENING状态;检查服务端日志文件,没有发现任何异常,但是已经有半小时没有收到任何客户端的连接请求了,而实际上这段时间有大量客户端在试图建立SOCKET连接;KILL掉服务端进程,重新启动后恢复正常;

从日志看服务端主进程一直在运行,并有日志输出,而端口监听线程没有任何日志输出了,怀疑该线程已经死掉;
请各位指点出现这种情况的原因,或者有没有什么办法能监控到监听线程的状态,当出现问题时能及时给出提示,重新启动程序 socket 线程 异常 linux kill --------------------编程问答-------------------- 求指教啊,哪位大牛帮帮忙啊 --------------------编程问答-------------------- 这个时候客户端可以ping通主机吗?客户端可以telnet主机其他开放的端口吗?先确认一下是不是网络原因 --------------------编程问答-------------------- 不是网络问题,能够ping通的 --------------------编程问答-------------------- 是主线程阻塞了吧 --------------------编程问答-------------------- 如果不是程序问题,用top查看下系统memory和CPU,有时候memory不够的情况下会出现这样的问题。 --------------------编程问答--------------------
引用 5 楼 huxiweng 的回复:
如果不是程序问题,用top查看下系统memory和CPU,有时候memory不够的情况下会出现这样的问题。


这些都是正常的没有问题
--------------------编程问答-------------------- 现在主要是想写程序来监控这个服务,这样能及时的发现问题,而不是等客户端连不上再提醒,求哪位大牛帮帮忙,有好的办法 --------------------编程问答--------------------
引用 7 楼 linktoyl 的回复:
现在主要是想写程序来监控这个服务,这样能及时的发现问题,而不是等客户端连不上再提醒,求哪位大牛帮帮忙,有好的办法
系统日志呢,这个出问题应该先去分析下系统日志。一般都会有异常信息的,可以先检查下 --------------------编程问答--------------------
引用 8 楼 huxiweng 的回复:
Quote: 引用 7 楼 linktoyl 的回复:

现在主要是想写程序来监控这个服务,这样能及时的发现问题,而不是等客户端连不上再提醒,求哪位大牛帮帮忙,有好的办法
系统日志呢,这个出问题应该先去分析下系统日志。一般都会有异常信息的,可以先检查下

没找到问题原因,监控服务也解决不了问题啊 --------------------编程问答-------------------- 看了的,没有问题的,是线程down了,重启服务就没有问题了,现在就是想能够监控他,让我们知道他是什么时候down的,不能等用户来反应吧,数据库时用的oracle --------------------编程问答-------------------- 监控端口线程 --------------------编程问答--------------------
引用 10 楼 linktoyl 的回复:
看了的,没有问题的,是线程down了,重启服务就没有问题了,现在就是想能够监控他,让我们知道他是什么时候down的,不能等用户来反应吧,数据库时用的oracle

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

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

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


这个方法我想到了的,现在是想看能不能有更好的方法,我先是在oracle数据库中通过查询session来判断服务是否正常,但是我又觉得这样麻烦 --------------------编程问答--------------------
引用 13 楼 linktoyl 的回复:
Quote: 引用 12 楼 huxiweng 的回复:

Quote: 引用 10 楼 linktoyl 的回复:

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

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


这个方法我想到了的,现在是想看能不能有更好的方法,我先是在oracle数据库中通过查询session来判断服务是否正常,但是我又觉得这样麻烦

判断session没你这个想法来的简单 --------------------编程问答-------------------- 那到底是有那张方法来得好呢 --------------------编程问答-------------------- 大牛,那用哪种方法更好呢 --------------------编程问答-------------------- 用lsof,可以查看打开的文件情况,因为socket连接也是作为文件,所以可以看到已经打开的连接数。
然后grep tcp和端口什么的关键字,过滤一下
看看同时连接到端口上有多少文件被打开,默认上线好像4万多。
如果满了,看看状态都是啥,有time wait1,time wait2,final wait,这三种是不是很多。
你去翻翻http协议的介绍,就知道都怎么回事了。
final wait不用管,好像time wait 2会自动进入final wait,time wait1可能需要手工杀。

netstat也可以替换lsof的,用法不一样。
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,