grpool协程池(goroutine池)性能测试

Go语言中的goroutine虽然相对于系统线程来说比较轻量级,但是在高并发量下的goroutine频繁创建和销毁对于性能损耗以及GC来说压力也不小。充分将goroutine复用,减少goroutine的创建/销毁的性能损耗,这便是grpool对goroutine进行池化封装的目的。例如,针对于100W个执行任务,使用goroutine的话需要不停创建并销毁100W个goroutine,而使用grpool也许底层只需要几千个goroutine便能充分复用地执行完成所有任务。经测试,在高并发下grpool的性能比原生的goroutine高出几倍到数百倍!并且随之也极大地降低了内存使用率。

测试环境

系统:Ubuntu Desktop 14.04.5 x64 LTS
芯片:Intel(R) Core(TM) i7-7700K
硬盘:Intel SSD 256G
内存:8G
软件:grpool

测试结果

使用的测试函数都是同一个,功能是从0累加到100W,函数定义如下:

1、Benchmark测试

脚本:https://gitee.com/johng/gf/blob/master/g/os/grpool/grpool_testb1_test.go

2、Benchmark测试,固定任务量

脚本:https://gitee.com/johng/gf/blob/master/g/os/grpool/grpool_testb2_test.go

本次测试任然采用benchmark的方式,不过每一次都固定了任务量,例如任务量为10000的测试中,benchmark会对方法进行连续12×10000的调用测试。

benchmark tasks 100 500 1000 5000 10000 50000 100000 500000 1000000
grpool(ns/op) 92 122 110 120 116 105 100 6486 5293
go(ns/op) 95 126 113 154 168 57417 57310 57368 57572 

使用goroutine无法完成500W个benchmark测试任务,消耗完毕12G(6G物理+6G虚拟)内存也不够用,因此这里的测试结果只统计到100W个benchmark测试任务。

 

3、内存使用量测试(KBytes)

脚本:https://gitee.com/johng/gf/blob/master/g/os/grpool/grpool_test.go

通过在测试脚本中嵌入runtime来获取当前进程的内存使用量

memory usage(KBytes) 100 500 1000 5000 10000 50000 100000 500000 1000000
grpool(ns/op) 101 189 217 395 591 2472 7049 23642 47732
go(ns/op) 135 291 492 2128 4226 21050 41849 207974 414689

使用goroutine无法完成500W个执行任务,消耗完毕12G(6G物理+6G虚拟)内存也不够用,因此这里的测试结果只统计到100W个执行任务。

 

 

 

 

 

 

 

 

 

 

Leave a Reply

Your email address will not be published.