金沙城中心娱乐城
www.jnh.澳门金沙.com
金沙娱乐平台官网
您现在的位置: > 技术服务 > 产品应用技巧 金沙国际娱乐官网
阅读

BESAppServer中网络超时分析-金沙娱乐平台官网

发布日期:2016-4-14 16:51:38 【 】金沙娱乐平台官网

1.   问题描述

XXXX微信公众平台是将腾讯微信公众号服务作为客户端,与自身建设的业务处理系统相结合而创建的App应用。本次协助排查的问题的业务场景描述如下:

XXXX每周不定期的通过微信平台向订阅了公众号的用户推送业务消息(如刮刮卡、流量赠送等)。推送人群数量目前大概在几十万甚至更多。订阅用户在收到推送的业务消息后,可以第一时间通过微信客户端办理业务。这样就会出现业务办理高峰。目前,后台业务处理系统有六个实例应用用于接收微信服务器发送的请求。后台业务处理系统与微信服务器的交互约定为如果由微信客户端发出的请求,微信服务器在5秒钟内得不到业务处理系统的回应则自动断开本次请求并向微信客户端发送消息“暂时无法提供该服务”。而当业务办理高峰期时,会出现大量的无法提供服务的情况,即5秒钟内微信服务器得不到业务处理系统的回应。

2.   分析及定位

问题分析主要通过以下四个方面:分析业务处理系统BES实例线程状态;分析四层负载与微信服务器、四层负载与业务处理系统交互时的网络数据包;分析微信服务器与业务处理系统单实例交互时的网络数据包。

2.1.  BES实例线程分析

通过抓取和查看BES实例的线程状态,可以看出实例的所有工作主线程都处于RUNNABLE(运行状态),且都在执行epollWait(等待写入TCP缓冲区)的方法,日志记录如下:

httpWorkerThread-8061-75" Id=117637 in RUNNABLE (running in native)

at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)

at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:210)

at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65)

at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)

at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)

……

实例对应的主工作线程截图如下:

 

分析结论:实例主线程都处于运行状态,且都在执行等待写入TCP缓冲区。该方法执行时间很长导致主线程未能及时释放出来且无法在5秒内向微信服务器返回结果,进一步导致微信服务器向微信客户端发送“无法提供服务”的提示和后续请求继续超时

 

2.2.  四层网络数据包分析-金沙娱乐平台官网

在业务高峰期时,BES实例的所有线程都在执行等待写入TCP缓冲区的方法,所以抓取四层负载与微信服务器、四层负载与业务处理系统交互时的网络数据包做进一步分析。首先分析四层负载与微信服务器交互的网络数据包发现四层负载向微信服务器发送大量状态为“TCP WINDOW FULL”的消息,说明四层负载的TCP缓冲区已满。

如下图所示:

 

其次分析四层负载与业务处理系统交互的网络数据包发现四层负载向BES实例发送大量状态为“TCP ZERO WINDOW”的消息,这一现象也说明四层负载的TCP缓冲区已经满,但BES实例还在保持长连接并试图发送数据。

如下图所示:

 

分析结论:在业务系统处理来自于微信服务器的请求时,如果业务处理缓慢,处理时常超过5秒钟,微信服务器自动断开连接(但不知具体断开连接的方式),而四层负载还在不停的尝试向微信服务器发送数据,导致TCP缓冲区中的资源无法及时释放直到超时为止。四层负载的TCP缓冲区满直接导致BES实例发送来的数据无法被接收,最终导致BES实例的TCP缓冲区也被占满,BES实例的主线程无法将数据写入TCP缓冲区,但主线程一直在尝试写入数据而无法释放出来直到超时。这是一个恶性循环,导致后边所有请求都会出现处理超时的情况。

 

2.3.  单实例网络数据包分析-金沙娱乐平台官网

为了进一步定位导致缓冲区写满线程无法及时释放的原因,将微信服务器与业务处理系统的单个实例连接并抓取网络包。通过对网络包分析后发现:

(1)微信服务器端也存在缓冲区满的情况(这是我们无法处理的)

(2)数据包中存在大量微信服务器向业务处理系统请求图片资源的流,图片比较大(700k左右)耗时较长,导致主线程被占用无法及时释放。如下图:

 

分析结论:BES主线程的处理效率及静态资源请求是导致发生堵塞的主要原因。

3.   简单处理措施

经过上述的分析后,解决BES主线程的执行效率和静态资源(如图片)请求处理的方式是主要根源。而BES主线程的执行效率主要是看业务系统中处理微信请求的方法的执行时间。对于被请求的大图片,将其大小调整在100k以内。后续跟踪,微信群发中未出现线程堵塞的情况。

4.   建议解决方案

针对目前发现的问题建议做如下处理:

(1)处理微信请求的方法中只实现启动子线程的动作,而具体的业务都在子线程中执行。启动完子线程后马上向微信服务器返回信息。这样应该可以保证5秒内向微信服务器返回信息,从而解决因为微信服务器自动断开连接导致TCP缓冲区满的情况。

(2)对于静态资源请求的处理,建议搭建静态资源服务器(目前好像只有图片)。这样请求静态资源就不会占用BES实例的主线程资源。建议使用nginx作为静态资源应用服务器。



www.jnh.澳门金沙.com
金沙sandsapp