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(ns/op) 100 500 1000 5000 10000 50000 100000 500000 1000000
grpool 92 122 110 120 116 105 100 6486 5293
go 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 101 189 217 395 591 2472 7049 23642 47732
go 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.