Go在WSL2的HTTP压测表现优于Windows

最近开始探索使用Redis、Docker,打算将服务器从Windows有计划的迁移到Ubuntu中。这将带来很多好处,例如支持插件的Nginx和更高性能的服务,同时为分布式集群的部署奠定基础。过渡阶段使用WSL2 Ubuntu在一台主机同时运行两个系统的服务。为了确保将部分服务迁移到WSL2时,不会出现较大的性能损失,使用ab对Go进行HTTP压测,测试其在WSL2和Windows的性能。

Go提供了强大的后端支持(尽管我还是喜欢TypeScript)和并发机制,且可以直接生成二进制文件。因此,比起额外部署Nginx或Node.js,使用Go可以更方便的对两个平台进行测试。于是,我在Windows和Ubuntu中分别为同样的Go代码编译了两份二进制文件,并直接运行。

ab是Apache提供的压测工具。为了确保测试的准确性,防止网络环境的不同带来的差异(WSL2和Windows不共用端口),我下载了Windows和Linux两个版本的ab进行压测。

以下是在WSL2中,使用ab对运行在两个平台的Go二进制文件进行的压测命令。

ab -n 10000 -c 1000 http://127.0.0.1:8000/

Server Software:
Server Hostname:        127.0.0.1
Server Port:            8000

Document Path:          /
Document Length:        37 bytes

Concurrency Level:      1000
Time taken for tests:   1.188 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      1540000 bytes
HTML transferred:       370000 bytes
Requests per second:    8414.63 [#/sec] (mean)
Time per request:       118.841 [ms] (mean)
Time per request:       0.119 [ms] (mean, across all concurrent requests)
Transfer rate:          1265.48 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   56  15.9     56      95
Processing:    25   58  18.7     59     101
Waiting:        1   19  12.8     17     100
Total:         51  114  17.3    111     152

Percentage of the requests served within a certain time (ms)
  50%    111
  66%    123
  75%    125
  80%    127
  90%    131
  95%    144
  98%    145
  99%    145
 100%    152 (longest request)
ab -n 10000 -c 1000 http://192.168.31.184:8000/

Server Software:
Server Hostname:        192.168.31.184
Server Port:            8000

Document Path:          /
Document Length:        37 bytes

Concurrency Level:      1000
Time taken for tests:   2.240 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      1540000 bytes
HTML transferred:       370000 bytes
Requests per second:    4464.79 [#/sec] (mean)
Time per request:       223.975 [ms] (mean)
Time per request:       0.224 [ms] (mean, across all concurrent requests)
Transfer rate:          671.46 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0  144 355.0      1    1101
Processing:     0   31  12.9     29     104
Waiting:        0   30  13.0     29     103
Total:          1  174 360.6     31    1202

Percentage of the requests served within a certain time (ms)
  50%     31
  66%     34
  75%     41
  80%     51
  90%   1054
  95%   1101
  98%   1145
  99%   1165
 100%   1202 (longest request)

上面的是对WSL2的压测,下面是Windows。可以看到,WSL2中,Golang平均每秒能处理8414.63个请求,而Windows中只能达到4464.79。

同时,我还使用了Windows版本的ab进行了压测,但两个平台的数据都停留在两千多左右,猜测是ab在Windows平台本身存在性能问题,故没有参考性。

由此可见,对于Golang在HTTP吞吐量上,加了一层虚拟化的Ubuntu的性能依然比Windows原生要好。因此,使用WSL2部署服务应该不会出现明显的性能瓶颈。并且,拥抱Linux带来的好处要远远高于虚拟化所带来的潜在性能损失。所以,在Windows平台逐步迁移到Linux的过程中,WSL2是一个不错的过渡选择(如果你像我一样只有一台服务器的话)。

欢迎来到Yari的网站:yar2001 » Go在WSL2的HTTP压测表现优于Windows