我正在努力提高网络应用的性能.分析应用程序本身,我发现它的响应时间是可以接受的(100ms-200ms),但是当我使用ApacheBench测试应用程序时,响应时间有时超过1秒.当我在日志中仔细观察,我发现之间有很大的差异request_time,并upstream_response_time偶尔:
"GET /wsq/p/12 HTTP/1.0" 200 114081 "-" "ApacheBench/2.3" 0.940 0.286
"GET /wsq/p/31 HTTP/1.0" 200 114081 "-" "ApacheBench/2.3" 0.200 0.086
Run Code Online (Sandbox Code Playgroud)
这upstream_response_time与我在网络应用程序中的分析非常接近,但request_time对于第一个请求接近一秒.
什么可能导致这种差异?
据我所知request_time,从收到的第一个字节到最后一个响应字节发送记录,它可能受网络状况和客户端问题的影响.我想知道我应该request_time尽可能多地降低平均值?
我们的 prometheus 中提供了入口控制器的以下 3 个指标,我试图了解这些指标之间的差异。
我的理解,
request_duration - 在 nginx 中到达请求与将响应发送回客户端之间的时间。
ingress_upstream_latency - 上游服务器/pod 接受请求之前 nginx 中等待的时间。
response_duration - 从后端容器 /pod 获取响应的时间
# HELP nginx_ingress_controller_request_duration_seconds The request processing time in milliseconds
# TYPE nginx_ingress_controller_request_duration_seconds histogram
# HELP nginx_ingress_controller_ingress_upstream_latency_seconds Upstream service latency per Ingress
# TYPE nginx_ingress_controller_ingress_upstream_latency_seconds summary
# HELP nginx_ingress_controller_response_duration_seconds The time spent on receiving the response from the upstream server
# TYPE nginx_ingress_controller_response_duration_seconds histogram
Run Code Online (Sandbox Code Playgroud)
因此,根据上述指标 request_duration = ingress_upstream_latency+ response_duration
我使用 nginx(1.15.3) 作为反向代理,并遇到日志文件中 $upstream_response_time 大于 $request_time" 的问题。
根据 nginx 文档,
$upstream_response_time
记录从上游服务器接收响应所花费的时间;时间以秒为单位,精度为毫秒。多个响应的时间由逗号和冒号分隔,就像 $upstream_addr 变量中的地址一样。
$请求时间
请求处理时间以秒为单位,精度为毫秒;从客户端读取第一个字节与将最后一个字节发送到客户端后写入日志之间经过的时间
因此,$request_time 应包括 $upstream_response_time。
我分析了日志记录总数,其中响应代码为200:
$upstream_response_time < $request_time : 35812
$upstream_response_time = $request_time : 157043
$upstream_response_time > $request_time : 32783
$upstream_response_time - $request_time = 0.001 : 32558
$upstream_response_time - $request_time = 0.002 : 225
Run Code Online (Sandbox Code Playgroud)
什么原因?
谢谢。