几天前,我遇到了客户在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。以下是我的观察:
据我所知,Filter是请求 - 响应生命周期的最后阶段之一。因此,如果Filter中的日志说该请求需要68毫秒而TCPDUMP声称响应是在10秒后发送的,那么是什么原因导致响应请求的延迟?
据我所知,在多线程环境中,特定语句执行后可能会进行上下文切换。但是上下文切换不应该导致这么多延迟。根据新遗物,在此负载测试期间,线程少于50个。
有人可以解释导致这种情况的原因吗?欢迎您在请求 - 响应生命周期中提供深入的见解。
答案 0 :(得分:0)
我能够通过增加FD限制来解决上述问题。 FD引起了迟到的反应。