前几天我遇到了一个问题,你们帮了我大忙。我已经为这个问题绞尽脑汁一个多星期了。基本上,我有几个 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 中,这以“基准测试模式”或“负载测试”模式完成 - 我忘记了确切的名称。