我有一个简单的 nginx 服务器,用于监控请求并将其存储在访问日志中。请求包含查询参数中的数据,大约 500 字节。我的输出只是一个 HTTP 204 响应。但是,当我监控网络带宽时,我看到传入速率为 8.44 Mbit/s,传出速率为 5.19 MBit/s。
问题是,为何出境率这么高?
“tcpflow -p -C -i eth0 port 80”的输出如下。
GET ############## HTTP/1.1
Host: ##############
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Forwarded: for="[############]"
Origin: ###########
Referer: #########
Save-Data: on
Scheme: http
Via: 1.1 Chrome-Compression-Proxy
X-Forwarded-For: #################
Connection: Keep-alive
User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; SM-J710FN Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36
write error to stdout
HTTP/1.1 204 No Content
Server: nginx/1.4.6 (Ubuntu)
Date: Fri, 10 Mar 2017 04:54:43 GMT
Connection: keep-alive
Access-Control-Allow-Origin: *
Content-Type: text/plain
答案1
为什么出局率这么高?
我认为我们无法合理地回答这个问题,但我们可以给你一些关于如何自己回答这个问题的想法。
您似乎专注于 http 服务器生成的流量。系统上的许多其他进程都可以使用网络。
我很想使用tcpdump详细查看线路上的数据包。通过此操作,我可以了解除 HTTP 之外还有哪些其他流量处于活动状态,以及这些流量对整体网络使用率的影响。然后,我可以根据需要进一步分析。
答案2
如果您的传入请求量比传出响应量大,那么您的配置文件对于 Web 服务来说有些不寻常 - 大多数 Web 服务发回的请求量远远超过接收的请求量。
查看您给出的输出,nginx 的响应大约是 167 字节,而您说平均请求大约是 500 字节。
因此,如果我们快速地进行一下计算,则每秒大约有 1MB(8Mb)的传入数据,每个请求 500 字节:1000000/500 = 2000 requests/sec
。我怀疑并非所有请求都返回您共享的 170 字节响应,因为6000000/8/170 = 4411
- 或者换句话说,要么某些响应远远大于 170 字节,要么(不太可能)您的服务器对每个请求响应两次。
所以我想问题在于每秒的请求/响应的大致范围(2000 到 ~4000)是否是预期的。