• 0
  • 0
分享
  • 动态QPS压测模型【Go语言】
  • FunTeste 2023-07-26 13:43:59 字数 2106 阅读 1056 收藏 0


之前写Kafka Client Go实践的时候,跟一位粉丝交流,Go语言的channel实现和Java的多线程实现的性能问题。就想做一次两者的性能测试进行对比。可惜Go语言用得少,还没形成快速进行性能测试的基础能力。所以得建设一些基础设施之后才行,今天分享一下,基于Go语言的动态QPS压测模型实现,算是基础能力建设的一部分了。


本文基于上期提到的Go语言的协程池,查到很多资料,有的不建议复用协程。原因主要两点:


1. 协程本身创建开销非常小,可以忽略。频繁创建和销毁协程并不会导致明显的性能瓶颈。

2. 协程设计本来基于简单化,使用协程池破坏了使用便捷性


对于第一个观点,以我现在知识和实践经验来说,不是太认同。任何资源的创建和销毁都会消耗资源。假如不适用协程池,那么每一个性能测试任务都消耗一个协程,每秒几万级别的资源创建和销毁事件,总觉得会很大影响施压机的性能。


第二观点,无法反驳,水平不够。就我自己的经验来说,协程池最大的好处是可以控制并发达到控制压测的目的。避免给其他服务造成过载的情况。在实际实践中,限制最大的请求压力,也有很多使用场景,这里不一一叙述。


# 思路


首先基于[Go语言协程池实现](https://mp.weixin.qq.com/s/5wtXVGbICntZqlk9RA1ygw),我增加了一个方法,实现将一个任务使用协程池发送N次,也就是添加N次任务即可。这里我复用FunTester在处理大量性能任务的一个经验,就是每次发送任务的数量进行设置。例如:需要任务执行1000次,那么分成100次,每次打包发送10个任务串行。这样可以避免使用更多的线程/协程。增加单个线程/协程每次执行任务的时长,避免下上文切换(协程切换也有成本,没找到对应专业名词),这个做法在Java实践中,效果非常明显。


```Go


// ExecuteQps

//  @Description: 执行任务固定次数

//  @receiver pool

//  @param t

//  @param qps

//

func (pool *GorotinesPool) ExecuteQps(t func(), qps int) {

mutiple := qps / pool.SingleTimes

remainder := qps % pool.SingleTimes

for i := 0; i < pool.SingleTimes; i++ {

pool.Execute(func() {

for i := 0; i < mutiple; i++ {

t()

}

})

}

pool.Execute(func() {

for i := 0; i < remainder; i++ {

t()

}

})

}

```


这里的`SingleTimes`默认值是10,这个根据实际任务执行的速度调整,我自己还没进行对比测试。


# 接收控制命令


这里依旧使用控制台输入当做控制命令的输入源,方法比较简单。


方法如下:


```Go

// HandleInput

//  @Description: 处理控制台输入内容

//  @param handle

//

func HandleInput(handle func(input string) bool) {

reader := bufio.NewReader(os.Stdin)

for {

text, _ := reader.ReadString('\n')

text = strings.Replace(text, "\n", "", -1)

if handle(text) {

break

}

}

}


```


# 用例Demo


这里有个坑,如果使用Go单元测试无法正常使用控制台输入。所以本次演示使用`main`方法执行测试用例了。


```Go

func main() {

pool := execute.GetPool(1000, 2, 200, 1)

var qps int = 1

go ftool.HandleInput(func(input string) bool {

put, error := strconv.Atoi(input)

if error == nil {

log.Printf("input content: %d", put)

qps = put

}

return false

})

for {

pool.ExecuteQps(func() {

log.Println(ftool.Date())

}, qps)

ftool.Sleep(1000)

}

pool.Wait()

}

```


最后一行,其实有些多余,因为通常使用手动结束进程来结束用例。



通过这个实现,感觉Go语言对使用`function`当做参数真的非常流畅。这一点Java N个`function`实现类着实让我有点懵逼。相比之下Groovy的`closure`也非常丝滑,但由于Groovy语言特性,经常会导致意外错误发生。总结起来,Go语言这方面是真香了。



  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 1 引言执行测试时离不开测试用例,测试用例辅佐执行测试,这就好比皇帝与宰相,需要的是相辅相成。既然相辅相成,那是不是就可以高枕无忧了?其则不然,任何事情都会有出错的可能,所以,测试用例也不列为。我们今天来看看,测试用例是如何出错。2 何为资源泄露2.1 资源泄露定义1、什么是资源泄露:资源泄露是指程序在使用完自己获取的资源之后,没有及时释放。资源泄露可能导致系统资源耗尽,造成程序不稳定甚至崩溃。2、举例:内存是一种资源,内存泄露bug,常常是造成程序out of memory的罪恶魁首。2.2 TestCase 中资源泄露1、TestCase的稳定性自动化测试的稳定性由多方面决定,包括被测软件...
            1 0 31750
            分享
          •   前言  无论做什么自动化,测试报告一定要有的,它可以清楚的展示出来我们执行用例的情况。便于查看自动化测试结果内容。安静这边了解目前通过python生成的测试报告分别有:HTMLTestRunner、BeautifulReport 、 pytest-html 和Allure,这几种报告内容都是属于不同的模板,本篇文章主要介绍下这如何生成以上四份报告的过程以及对比情况。  HTMLTestRunner  HTMLTestRunner是Python标准库的unittest模块的扩展。它生成易于使用的HTML测试报告。使用时需要下载,然后放到项目目录中  下载地址:http://tungwaiyi...
            12 12 1841
            分享
          • 新浪科技讯北京时间11月16日早间消息,据报道,知情人士透露,亿万富翁埃隆·马斯克(Elon Musk)旗下的SpaceX正在进行谈判,该准备在新一轮融资中筹集近10亿美元,这将使这家火箭发射和卫星的估值达到1500亿美元左右。知情人士称,在正在进行中的谈判中,SpaceX的每股价格约为85美元,并将该今年早些时候的1205亿美元估值进一步推高。其中一位知情人士补充说,该公司的本轮融资可能会获得近10亿美元的资金。这表明,投资者对该的兴趣很高,而与此同时,其他一些处于后期融资的初创企业却不得不面临削减估值的情况。对此,SpaceX没有立即对置评请求做出回应。据悉,SpaceX与亚马逊创始人杰夫...
            0 0 1108
            分享
          •   在软件相关行业中,如果说开发属于一个开创型的岗位,是从无到有的过程,那么测试则是一个需要多重沟通的岗位。为什么我们常说测试是衔接岗位呢,原因不仅是测试参与的项目环节很多,并且测试对接的人员,需要打交道的人员比较杂,是一个承前启后不可或缺的一环,测试在整个过程中更多的是发挥推动的作用。测试岗位越往上走,越能发掘沟通的重要性。  如果想做好一个测试管理人才,除了跟进项目上的事情,还要学会跟不同的人员沟通。这样才能推动问题有效的快速解决。我们从三个方面说明测试衔接的必要性。  第一部分:功能测试参与的项目过程  先来看下测试为了保障软件质量,需要做的事情,在每一个环节中测试都需要衔接不同环节。 ...
            0 0 800
            分享
          •   内卷,是现在热度非常高的一个词汇,随着热度不断攀升,隐隐到了“万物皆可卷”的程度。究其来源,内卷这个词的出现,是伴随着996的讨论开始的。  很不幸,996、福报这些词的重灾区和源头就是计算机/互联网行业,那么作为行业中一个非常重要的分支,测试圈的情况怎么样呢?  软件测试圈的内卷是怎样的?  在谈起测试圈的内卷之前,我们必须先搞清楚常说的内卷是什么。  内卷,网络流行词,本意是指人类社会在一个发展阶段达到某种确定的形式后,停滞不前或无法转化为另一种高级模式的现象。当社会资源无法满足所有人的需求时,人们通过竞争来获取更多资源。  后经网络流传,用来指代非理性的内部竞争或“被自愿”竞争,现在...
            11 11 972
            分享
      • 51testing软件测试圈微信