欢迎来到天天文库
浏览记录
ID:21334723
大小:49.05 KB
页数:4页
时间:2018-10-21
《androidpn使用一段时间后推送不成功解决方案》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Androidpn使用一段时间后推送不成功解决方案一、问题背景服务端在使用一段时间后推送没有反应,检测后发现部署服务的服务器端口被占用尽了。Androidpn使用的mina框架维持与客户端的长连接,本质上还是可以当成基本的socket通讯进行分析。根据以往的经验,应当是’’toomanyopenfiles”导致socket连接不能建立。二、定位测试现进行了如下测试,使用netstat看看网络连接状态(netstat-na
2、findstr”5222’’命令监视服务端的5222端口,该端口为Androidpn监听socket连接所用)。正常关闭客户端时,观察到服务端连接可以正常释放。当
3、客户端网络异常断开后(如幵启飞行模式、或者用户在地铁等网络信号差的地方),服务端连接没有释放,端口依旧被占用。一直进行这样的测试,发现大量的127.0.0.1到127.0.0.1的连接,状态为ESTABLISHED,端口看起来是逐步增加的。Usersliujian>netstat一na!findstr’’5222’’LISTENINGESTABLISHEDESTABLISHEDLISTENINGESTABLISHEDESTABLISHEDTCP0.0-0-0:52220-0.0-0:0TCP192.168.123.111:5222192.168.123.101:53113TCP
4、192.168.123.111:5222192.168.123.121:44949Usersliujian>netstat-na!findstr"5222"TCP0.0-0-0:52220-0.0-0:0TCP192.168.123.111:5222192.168.123.101:53113TCP192.168.123.111:5222192.168.123.121:44949所以当客户端不停的进行连接导致服务端的连接数越来越多,最终导致服务器文件句柄消耗完了再无法建立socket连接,英文名词为“socketleak”。三、解决分析mina框架駡于apache公司,针对”to
5、omanyopenfiles”的情况,apache的官方网站上提供了两种解决方案:1调整Linux操作系统的打开文件的最大句柄数。要永久生效修改:/etc/security/limits.conf文件在文件最后加上以下信息:*-nofile65536以上语句表示,每个用户打开文件的个数为65536个修改文件:/etc/sysctl.conf在文件最后一行加上:fs.file-max=65536重启服务器后运行:ulimit-aLimix系统默认文件句柄数是1024,修改为65536之后可以缓解问题出现的频率,但其实并没有解决端口被占用的问题。2减少操作系统socket连接的等待时间
6、。在windowsTIME_WAIT的缺省值是4minutes,在Linux屮时60秒;减少timeout的吋间,该吋间内没脊通讯就断开socket连接。此方案主要用来解决高数量的连接并发时导致系统文件句柄数被消耗过快的问题,但其实并不适用于我们的实际情况。因为我们就是要建立持久的连接,而不是迅速关闭空闲连接。四、实际方案不过方案2提供了一个解决思路,其实我们主要的问题就是要释放哪些因异常而占用的端口,所以如果能够在服务端检测到一定时间内一直空闲的连接(此吋间段可以根据只体业务设定),我们可以认为该连接失效而关闭就可以释放被占用的端口。分析客户端使用的实现建立维持连接的smack包
7、的源码,发现就是一个简单的newSocket(host,port)以及通过线程维持的心跳检测。分析服务端的代码找到一个函数sessionldle(),在笑org.androidpn.server.xmpp.net.Xmpp工oHandler屮。该函数的解释为Invokedwiththerelated工dleStatuswhenaconnectionbecomesidle意思是当一个连接空闲吋触发,所以我们可以在该函数中加入关闭会话连接的处理。publicvoidsession工die(IoSessionsession,IdleStatusstatus)throwsException
8、{log.debug("session工die()•••’’);Connectionconnection=(Connection)session.getAttribute(CONNECTION);ifisDebugEnabled()){log.debug(HClosingconnectionthathasbeenidle:"+connection);}connection.close();session•close(true);//timeoutnow,closeit
此文档下载收益归作者所有