nginx $upstream_response_time具体什么时候开始/停止

disho6za  于 2023-06-28  发布在  Nginx
关注(0)|答案(2)|浏览(168)

有没有人知道$upstream_response_time的时钟具体是什么时候开始和结束的?
文档似乎有点模糊:
保持从上游服务器接收响应所花费的时间;时间以秒为单位保持,具有毫秒分辨率。几个响应的时间用逗号和冒号分隔,就像$upstream_addr变量中的地址一样。
还有一个$upstream_header_time值,这增加了更多的混乱。
1.我假设$upstream_connect_time在连接建立后就停止了,但是之前它被上游接受了?

  • $upstream_response_time包含什么?
  • 等待上游接受所花费的时间?
  • 发送请求所花费的时间?
  • 发送响应标头所用的时间?
63lcw9qa

63lcw9qa1#

一个更具体的定义是在它们的blog中。

$request_time-完整请求时间,从NGINX从客户端读取第一个字节开始,到NGINX发送响应体的最后一个字节结束
$upstream_connect_time-与上游服务器建立连接所花费的时间
$upstream_header_time-从建立到上游服务器的连接到接收到响应头的第一个字节之间的时间
$upstream_response_time-从建立到上游服务器的连接到接收到响应正文的最后一个字节之间的时间

所以呢

  • $upstream_header_time包含在$upstream_response_time中。
  • 连接到上游所花费的时间不包括在这两个时间中。
  • 向客户端发送响应所花费的时间不包括在两者中。
mctunoxg

mctunoxg2#

我已经调查并调试了相关的行为,结果如下:
| | start time | end time |
| - -----|- -----| ------------ |
| Nginx与上游服务器建立TCP连接之前|在Nginx向上游服务器发送HTTP请求之前| before Nginx sends HTTP request to upstream server |
| Nginx与上游服务器建立TCP连接之前|Nginx接收并处理来自上游服务器的HTTP响应中的头部后| after Nginx receives and processes headers in HTTP response from upstream server |
| Nginx与上游服务器建立TCP连接之前|Nginx接收并处理来自上游服务器的HTTP响应后| after Nginx receives and processes HTTP response from upstream server |

源码

我将解释$upstream_connect_time和$upstream_response_time之间的值是如何不同的,因为这是我最感兴趣的。
u->state->connect_time的值表示$upstream_connect_time(以毫秒为单位),将在以下部分中获取:https://github.com/nginx/nginx/blob/3334585539168947650a37d74dd32973ab451d70/src/http/ngx_http_upstream.c#L2073

if (u->state->connect_time == (ngx_msec_t) -1) {
        u->state->connect_time = ngx_current_msec - u->start_time;
    }

u->state->response_time的值,以毫秒为单位表示$upstream_response_time,在以下部分中设置:https://github.com/nginx/nginx/blob/3334585539168947650a37d74dd32973ab451d70/src/http/ngx_http_upstream.c#L4432

if (u->state && u->state->response_time == (ngx_msec_t) -1) {
        u->state->response_time = ngx_current_msec - u->start_time;

您可以注意到,这两个值都是基于u->start_time计算的,u->start_time是在www.example.com中定义的连接建立之前的时间https://github.com/nginx/nginx/blob/3334585539168947650a37d74dd32973ab451d70/src/http/ngx_http_upstream.c#L1533(注意ngx_event_connect_peer是在nginx workerprocesses和上游服务器之间建立TCP连接的函数)。
因此,这两个值都包括建立TCP连接所花费的时间。您可以通过使用gdbserver等工具进行实时调试来检查这一点。

相关问题