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

发表于:2018-1-17 11:47

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:John    来源:个人博客

  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,函数定义如下:
  func increment() {
  for i := 0; i < 1000000; i++ {}
  }
  1、Benchmark测试
  脚本:https://gitee.com/johng/gf/blob/master/g/os/grpool/grpool_testb1_test.go
  john@johnstation:~$ go test *.go -bench=".*" -benchmem
  mem usage: 23680
  mem usage: 236013
  goos: linux
  goarch: amd64
  BenchmarkGrpool_1-8      10000000       174 ns/op      48 B/op       1 allocs/op
  BenchmarkGoroutine_1-8    1000000     57464 ns/op     413 B/op       0 allocs/op
  2、Benchmark测试,固定任务量
  脚本:https://gitee.com/johng/gf/blob/master/g/os/grpool/grpool_testb2_test.go
  本次测试任然采用benchmark的方式,不过每一次都固定了任务量,例如任务量为10000的测试中,benchmark会对方法进行连续12×10000的调用测试。
  使用goroutine无法完成500W个benchmark测试任务,消耗完毕12G(6G物理+6G虚拟)内存也不够用,因此这里的测试结果只统计到100W个benchmark测试任务。
  3、内存使用量测试(KBytes)
  脚本:https://gitee.com/johng/gf/blob/master/g/os/grpool/grpool_test.go
  通过在测试脚本中嵌入runtime来获取当前进程的内存使用量。

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

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号