Play(Scala)2.4.X中的请求 - 响应生命周期

时间:2016-12-26 11:17:19

标签: scala playframework playframework-2.0

几天前,我遇到了客户在20秒后收到来自播放应用程序的回复的问题。我在生产服务器上设置了新的遗物,它不断讲述RPM,平均响应时间,CPU和内存使用情况等。根据新的遗物响应时间不超过500毫秒,但我确认客户端在20秒后收到响应。为了挖掘更多信息,我添加了一些日志,告诉我们在播放应用程序中提供请求所需的时间。我按以下方式添加了日志过滤器:

val noCache = Filter { (next, rh) =>
      val startTime = System.currentTimeMillis
      next(rh).map { result =>
        val requestTime = System.currentTimeMillis - startTime
        Logger.warn(s"${rh.method} ${rh.uri} took ${requestTime}ms and returned ${result.header.status}")
        result.withHeaders(
          PRAGMA -> "no-cache",
          CACHE_CONTROL -> "no-cache, no-store, must-revalidate, max-age=0",
          EXPIRES -> serverTime
        )
      }
  }

  private def serverTime = {
    val calendar = Calendar.getInstance()
    val dateFormat = new SimpleDateFormat(
      "EEE, dd MMM yyyy HH:mm:ss z")
    dateFormat.setTimeZone(calendar.getTimeZone)
    dateFormat.format(calendar.getTime())
  }

在我的负载测试期间,我向play-app发送了大约3K并发请求,并为所有请求捕获了TCPDUMP。以下是我的观察:

  1. 根据play-application-log,最大时间播放应用响应时间为68毫秒。
  2. 根据TCPDUMP响应任何请求所需的最长时间约为10秒。
  3. 根据新遗物的最大响应时间约为84毫秒(因为这非常接近我添加的日志,我们可以忽略这一点)
  4. 据我所知,Filter是请求 - 响应生命周期的最后阶段之一。因此,如果Filter中的日志说该请求需要68毫秒而TCPDUMP声称响应是在10秒后发送的,那么是什么原因导致响应请求的延迟?

    据我所知,在多线程环境中,特定语句执行后可能会进行上下文切换。但是上下文切换不应该导致这么多延迟。根据新遗物,在此负载测试期间,线程少于50个。

    有人可以解释导致这种情况的原因吗?欢迎您在请求 - 响应生命周期中提供深入的见解。

1 个答案:

答案 0 :(得分:0)

我能够通过增加FD限制来解决上述问题。 FD引起了迟到的反应。