![性能差异:本地机器 VS 亚马逊中型实例](https://linux22.com/image/579796/%E6%80%A7%E8%83%BD%E5%B7%AE%E5%BC%82%EF%BC%9A%E6%9C%AC%E5%9C%B0%E6%9C%BA%E5%99%A8%20VS%20%E4%BA%9A%E9%A9%AC%E9%80%8A%E4%B8%AD%E5%9E%8B%E5%AE%9E%E4%BE%8B.png)
当我在本地机器上使用 apache 基准测试 (ab) 运行它时,我发现性能矩阵与托管在亚马逊中型实例。对两者运行了相同的并发请求 (5) 和相同的总请求数 (111)。亚马逊的内存比我的本地机器好。但我的本地机器有 2 个 CPU,而 m1.medium 只有 1 个 CPU。我的互联网速度目前非常低,传输速率为 25.29KBps。我该如何提高性能?
不知道如何解释 ab 输出中的连接、处理、等待和总计。
Here is Localhost:
Server Hostname: localhost
Server Port: 9999
Document Path: /
Document Length: 7631 bytes
Concurrency Level: 5
Time taken for tests: 1.424 seconds
Complete requests: 111
Failed requests: 102
(Connect: 0, Receive: 0, Length: 102, Exceptions: 0)
Write errors: 0
Total transferred: 860808 bytes
HTML transferred: 847155 bytes
Requests per second: 77.95 [#/sec] (mean)
Time per request: 64.148 [ms] (mean)
Time per request: 12.830 [ms] (mean, across all concurrent requests)
Transfer rate: 590.30 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.5 0 1
Processing: 14 63 99.9 43 562
Waiting: 14 60 96.7 39 560
Total: 14 63 99.9 43 563
And this is production:
Document Path: /
Document Length: 7783 bytes
Concurrency Level: 5
Time taken for tests: 33.883 seconds
Complete requests: 111
Failed requests: 0
Write errors: 0
Total transferred: 877566 bytes
HTML transferred: 863913 bytes
Requests per second: 3.28 [#/sec] (mean)
Time per request: 1526.258 [ms] (mean)
Time per request: 305.252 [ms] (mean, across all concurrent requests)
Transfer rate: 25.29 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 290 297 14.0 293 413
Processing: 897 1178 63.4 1176 1391
Waiting: 296 606 135.6 588 1171
Total: 1191 1475 66.0 1471 1684
答案1
首先,2 个 CPU 与 1 个 CPU 之间肯定有很大区别。根据许多其他因素,仅这一点就可以解释一些性能差异。然而,这里最大的问题是连接。
据我了解,您想知道为什么 Amazon 实例比您的本地机器慢这么多?即使硬件规格表明它们应该相对可比?我假设您在本地和 Amazon EC2 实例上运行相同的设置。当您运行基准测试时,您会在本地机器上对两者进行测试。此外,我们可以看到您的互联网连接速度相当慢。
实际情况是,通过网络运行测试的时间比在本地运行测试的时间长得多。完整的答案比我在这里能给出的要长得多(它涉及 Web 请求和 HTTP 的工作方式,以及 TCP 的工作方式、建立连接的三次握手,以及延迟和吞吐量限制如何影响网络性能)。简而言之,当您运行该测试时,您不是在测试硬件之间的相互关系,而是在测试网络连接。而且 LAN(通常)总是会成为 WAN。
这也说明了许多开发人员(无论是网络开发人员还是非网络开发人员;任何拥有通过网络通信的应用程序的人)都会陷入一个严重的陷阱。人们经常会在他们旁边的机器上运行他们的网站或应用程序或其他东西时对其进行测试,然后想,“哇!这太快了。我太棒了!”。他们忘记做的是在现实世界条件。仅仅因为您有一台 23 英寸宽屏显示器并不意味着每个人都有。仅仅因为您全屏运行 Web 浏览器并不意味着每个人都有。当然,通过 LAN 加载数据很快,但对于地球另一端的人来说呢?这些都是在开发网页或网络应用程序时需要考虑的事情。