为什么在 nginx access.log 中 request_time 比 upstream_response_time 大很多?

Why is request_time much larger than upstream_response_time in nginx access.log?

我正在尝试提高网络应用程序的性能。分析应用程序本身,我发现它的响应时间是可以接受的(100ms-200ms),但是当我使用 ApacheBench 测试应用程序时,响应时间有时会超过 1 秒。仔细看日志的时候偶尔会发现request_timeupstream_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

upstream_response_time 非常接近我在网络应用程序中的分析,但 request_time 接近第一个请求的一秒。

什么可能导致这种差异?

我理解request_time记录了从接收到的第一个字节到发送的最后一个响应字节,它可能会受到网络状况和客户端问题的影响。我想知道我应该怎么做才能尽可能地降低平均数 request_time

request_time 可能是由于客户端连接速度慢,对此您无能为力。因此,高 request_time 不一定 代表服务器 and/or 应用程序的性能。

您真的不应该在分析时在 request_time 上花费太多时间,而应该测量应用程序的响应时间(即 upstream_response_time)。

也就是说,有些事情您可以做并且可能影响request_time。其中一些如下:

  • 将您的服务器移动到高速网络上
  • 将服务器移到客户端附近
  • 禁用 Nagle's algorithm
  • 调整服务器的 TCP 堆栈(参见 this article)。然而,这些不一定会有很大的不同,因为内核会很好地为您调整它们。