性能缓慢 - IIS还是应用程序?

时间:2016-03-02 11:31:53

标签: c# android asp.net iis

我们的团队在Android中有一个应用程序,在IIS中托管了.NET c#后端。 最近,我们通过以下方案观察了客户突然和无法解释的延迟:

  • 没有任何警告,用户可以更改频道(Zapping),因为该产品与Live Media Streaming有关,而且他们甚至无法退出应用程序
  • 连接到另一个后端(仍然是c#后端)的移动应用程序正常运行,没有任何问题
  • 经过一段时间(从第一次事件的6个小时到最后一个事件的5个小时),一切都恢复正常。

我启用了失败的请求跟踪日志,看看我是否能从中获取任何内容,并且我的结果如下:

<failedRequest url="https://ourDNS.com:443/servertime.aspx"
               siteId="1"
               appPoolId="DefaultAppPool"
               processId="22232"
               verb="POST"
               remoteUserName=""
               userName=""
               tokenUserName="NT AUTHORITY\IUSR"
               authenticationType="anonymous"
               activityId="{80013C53-0802-B500-B63F-84710C7967BB}"
               failureReason="TIME_TAKEN"
               statusCode="200"
               triggerStatusCode="0"
               timeTaken="45141"
               xmlns:freb="http://schemas.microsoft.com/win/2006/06/iis/freb"
               >

上述页面是一个简单的页面,首先获取服务器的时区,然后在获取客户的时区(可以从客户端手动设置)后,返回确切的日期和托管应用程序的设备的时间,进一步计算流程序,现在播放的内容等等。但是,对于这个页面,它返回一个带有字符串的简单JSON,它需要超过45秒的时间(到我这是疯了)。 来自客户端的另一个日志是上面的一个例外:

java.net.SocketTimeoutException
at java.net.PlainSocketImpl.read(PlainSocketImpl.java:491)
at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191)
at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:82)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:180)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235)
at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:428)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at com.framework.utilityframe.webhelper.HttpRequest.getHttpResponse(HttpRequest.java:316)
at com.framework.utilityframe.webhelper.HttpRequest.httpRequest(HttpRequest.java:393)
at com.tibo.webtv.web.TiboLog.logBufferingError(TiboLog.java:319)
at com.tibo.webtv.CustomVideoView$Buffering_Problem.doInBackground(CustomVideoView.java:324)
at com.tibo.webtv.CustomVideoView$Buffering_Problem.doInBackground(CustomVideoView.java:307)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)

通过不同的论坛阅读,我看到了从数据库到IIS,甚至是应用程序配置错误的性能泄漏的不同原因。我丢弃了数据库作为原因,因为:

  • 在问题发生的那一刻,数据库参数绝对正常,查询时间执行没有变化,没有等待任务,没有锁定
  • 其次,移动和解码器应用程序连接到同一个数据库,移动应用程序运行正常,具有相同的查询

现在,如果我想到IIS,那个AppPool上托管的每个应用程序都运行良好且没有延迟,但仍然可能有一些我在那里缺少的东西 至少,让我怀疑的是,移动应用程序在两种方式上与解码器应用程序有所不同:

  • 首先,移动应用程序从XML格式的后端获取响应,解码器使用JSON。
  • 其次,移动应用程序使用http请求,解码器使用https(SSL)

如果有人遇到类似问题,我们将非常感谢他们的帮助。对于您需要的任何其他细节,只需询问,我将提供。

1 个答案:

答案 0 :(得分:0)

所以, 今天,我们的团队进行了另一项测试,其中包括:

  • 应用程序托管在一个服务器和数据库中另一个

  • 托管在完全不同的服务器(Azure环境)中的应用程序和数据库

在这两种情况下,结果都是相同的:服务中的延迟和问题。 问题既不在后端也不在服务器上。首先,在将日志保存到另一台服务器时,Java应用程序错误地执行了Sync Tasks(专用,完全有可能保留尽可能多的数据)。其次,日志服务器有一个完整的硬盘驱动器,只有超过1 TB的DB日志,因此当应用程序执行那些同步任务(作为第一次调用时,在与通道进行任何交互之前),它们会收到套接字异常。所以,也许对于可能会看到这篇文章的其他人:请务必在您的应用程序中检查您的任务,并始终检查与您的应用程序相关的任何服务器!非常感谢你:D