最近开始探索使用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