来自nginx logging docs
$request_time - 完整的请求时间,从 NGINX 读取第一个开始
来自客户端的字节并在 NGINX 发送最后一个字节时结束
响应正文
...NGINX 发送最后一个字节...
这意味着它已将最后一个字节发送到底层操作系统。所以 TCP 套接字缓冲区可能已经存储了字节并试图将它们发送到客户端。
Here 是对这种情况的分析。
Nginx 不关心客户端和服务器之间的 RTT(往返时间)。这是操作系统/客户端问题。
从客户端 ping 服务器可以让您了解响应时间的顺序。如果 ping 时间大于 nginx 的$response_time,则性能无法接近$request_time。
ping -c3 -s 1450 www.kernel.org
PING ord.git.kernel.org (147.75.58.133) 1450(1478) bytes of data.
1458 bytes from ord1.git.kernel.org (147.75.58.133): icmp_seq=1 ttl=48 time=191 ms
1458 bytes from ord1.git.kernel.org (147.75.58.133): icmp_seq=2 ttl=48 time=192 ms
1458 bytes from ord1.git.kernel.org (147.75.58.133): icmp_seq=3 ttl=48 time=198 ms
--- ord.git.kernel.org ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 191.155/194.026/198.468/3.205 ms
作为一种近似方法,如果您的响应大小为 4.5kB 且最大 TCP 数据包大小约为 1.5kB,您可以预期总时间最多为 ping 时间的 3 倍。
在 Linux 机器上,最大传输单元 (MTU) 为 1500:
ip addr | grep 'eth0: .*mtu'
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
DNS 解析可能会产生影响。