NGinx 的 HTTP 吞吐量很慢

NGinx 的 HTTP 吞吐量很慢

前几天我遇到了一个问题,你们帮了我大忙。我已经为这个问题绞尽脑汁一个多星期了。基本上,我有几个 nginx 服务器反向代理一个在 uwsgi 上运行的 python 应用程序,当延迟(有点)高时,它们提供的 http 响应非常慢。每台服务器都有 2Gb 的互联网连接,我自己的连接速度超过 200Mb。我离服务器只有 50ms 的距离。

当我针对同一数据中心的服务器运行 apachebench 时,结果如下:

Document Length:        68093 bytes

Concurrency Level:      1
Time taken for tests:   0.912 seconds
Complete requests:      10
Failed requests:        0
Total transferred:      685380 bytes
HTML transferred:       680930 bytes
Requests per second:    10.96 [#/sec] (mean)
Time per request:       91.217 [ms] (mean)
Time per request:       91.217 [ms] (mean, across all concurrent requests)
Transfer rate:          733.76 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:    89   91   1.9     91      95
Waiting:       81   84   1.9     83      87
Total:         89   91   1.9     91      95

Percentage of the requests served within a certain time (ms)
  50%     91
  66%     91
  75%     93
  80%     93
  90%     95
  95%     95
  98%     95
  99%     95
 100%     95 (longest request)  

这正是我所期望的。

然而,当我从我的电脑上运行 apachebench 时,我得到的结果是:

Document Length:        68093 bytes

Concurrency Level:      1
Time taken for tests:   2.827 seconds
Complete requests:      10
Failed requests:        0
Total transferred:      685380 bytes
HTML transferred:       680930 bytes
Requests per second:    3.54 [#/sec] (mean)
Time per request:       282.739 [ms] (mean)
Time per request:       282.739 [ms] (mean, across all concurrent requests)
Transfer rate:          236.73 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       47   48   1.6     48      51
Processing:   223  234  15.7    230     278
Waiting:      130  138  13.9    134     177
Total:        272  283  16.7    277     328

这大约是处理时间的三倍,传输速率大约是三分之一。唯一的区别是延迟。为什么延迟会导致传输速度如此大幅下降?这会导致我们的网站出现明显的延迟。看来 nginx 不会一次发送整个有效负载,而是等待 ACK 数据包后再发送更多有效负载,这导致延迟降低了吞吐量。我查看了 tcpdump,看来 nginx 每个数据包也只发送 4k 数据。

你们有没有什么建议可以提高此连接的速度,以便充分利用可用带宽?谢谢!

答案1

当我对正在开发的网站进行负载测试时,我通过一台快速计算机的快速连接每秒获得了 250 个交易,从同一数据中心的服务器我每秒获得了 2500 个交易。

正如您所说,延迟就是答案。它只是增加了工作完成之前的时间,因此需要等待。负载也会降低。

您只使用了一个连接并发出了 10 个请求(并发性为 1)。如果您的延迟为 250 毫秒,则从远程连接测试的等待时间为 2.5 秒 - 可能要翻倍,因为数据是双向传输的。如果您的延迟只有 5 毫秒,那么延迟会减少到 50 毫秒,这是难以察觉的。

如果您想使用完整连接来对系统进行负载测试,则需要并行运行许多测试 - 20、50,甚至 1000。这会增加并发性。在 Siege 中,这以“基准测试模式”或“负载测试”模式完成 - 我忘记了确切的名称。

相关内容