之前搭建的push layer 需要有一个性能指标,leader 让我做的这个性能测试.其实Go的工具 go-tools 里面是有go test 的,可以测benchmark ,并且是支持Parallel的,非常的方便,不过我想借此机会了解一下benchmark的设计思路和原理,所以自己写了一个.
我测试的目标代码是一个网络io型程序,主要涉及到rpc的调用和redis的查询检索,偏向于网络io,涉及到的部分mqtt协议解包封包用到了一小部分现成的库并不是一个cpu消耗型的程序,逻辑不算复杂.
Benchmark 说起来很简单,就是并发的请求,记录响应时间,求出 qps,也可以很好的想到设计方式,使用单链接,密集发送tcp request.然而过程中还是遇到了一些思路上的问题.
1\ 如何设计并发
其实这个还是涉及到什么叫做并发.现代PC几乎都是多道系统,cpu 大多是多核多线程,程序其实是在不停地在用户线程与系统内核线程之间进行切换,系统内核执行操作系统原语,用户线程通过调度类似与系统线程在core上执行.但是这种并发,其实是宏观的,只是说在一短时间内有多少个用户线程被执行了,这个宏观上看起来如同大家都在一起跑,微观上其实是多道分时操作系统划分了cpu时间片分别调度他们执行.golang在引入了gouroutine之后,本来N-1的模型,扩展到了N-M.本来很基础的问题最后成了我设计的测试程序的第一个逻辑错误.
2\qps峰值与压力的关系
实体机(非docker)下测试环境,性能与压力之间其实是一个曲线关系:
<