热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang基准测试Benchmark和Jmeter压测实践

gotest自带有三种测试:今天主要是写一下基准测试也就是我们的性能测试实践相关。基准测试是测量一个

golang的性能测试Benchmark

go test 自带有三种测试:

  • 功能测试(单元测试)
  • 基准测试 (性能测试)
  • 实例测试 (举例测试)

今天主要是写一下基准测试也就是我们的性能测试实践相关。

基准测试是测量一个程序在固定工作负载下的性能。

在 Go 语言中,基准测试函数和普通测试函数写法类似,但是以Benchmark为前缀名,并且带有一个 testing.B类型的参数; testing.B参数除了提供和*testing.T类似的方法,还有额外一些和性能测量相关的方法。

它还提供了一个整数N,用于指定操作执行的循环次数。

func BenchmarkAdapter_GetReport(b *testing.B) {
    a := &Adapter{
        Server: "127.0.0.1:9094/tenant",
    }
    for i := 0; i  
 

然后在命令行输入如下:

go test -bench=GetReport

又或者直接填入测试函数名:

go test -bench=BenchmarkAdapter_GetReport

最终显示数据如下:

goos: darwin
goarch: amd64
pkg: safeuem/report/service/adapter
BenchmarkAdapter_GetReport-4         500       2351618 ns/op       20770 B/op        301 allocs/op
PASS
ok      safeuem/report/service/adapter  2.741s
  • BenchmarkAdapter_GetReport-4 :

这里的-4中的4 表示最大 P 数量,最大 P 数量相当于可以同时运行 goroutine 的逻辑 CPU 的最大个数。这里的逻辑 CPU,也可以被称为 CPU 核心,但它并不等同于计算机中真正的 CPU 核心,只是 Go 语言运行时系统内部的一个概念,代表着它同时运行 goroutine 的能力。

对应 golang 就是 GOMAXPROCS 的值。这个你可以自行设置,可以通过调用 runtime.GOMAXPROCS 函数改变最大P数量,也可以在命令行 go test 加入 -cpu=2 。

  • 500 2351618 ns/op

显示每次调用 GetReport 函数花费 2.351618毫秒 ,是执行 500次 的平均时间。

1s=1000ms=1000000us=1000000000ns

因为基准测试驱动器开始时并不知道每个基准测试函数运行所花的时间,它会尝试在真正运行基准测试前先尝试用较小的N运行测试来估算基准测试函数所需要的时间,然后推断一个较大的时间保证稳定的测量结果

  • 20770 B/op 301 allocs/op

表示平均500此种,每次分配了内存为 20770 B(字节) = 20.28KB = 0.0198MB 和 每次调用分配了 301次

1MB=1024KB

1KB=1024B

  • 2.741s

表示测试总耗时。

小提示:

其实这里的总耗时,其实默认是1s,当测试次数逐渐递增到时间刚好超过1s 时测试就会停止,并显示测试,这里是500次。

当然如果你的本身的测试函数运行一次就已经大于了1s,为了提高测试的精确性,你可以在命令行输入 :

go test -bench=GetReport -benchtime=5s

jmeter 压力测试

首先要安装 请看链接不多说

如果下载页面进不去 移步到此处下载即可

注意 : 一定要配置好 java 的环境变量才开始压测哦!

运行启动如图所示:

golang基准测试Benchmark和Jmeter压测实践

image

1. 你可以开始配置要测试的http接口:

golang基准测试Benchmark和Jmeter压测实践

image

2. 线程数的配置:

golang基准测试Benchmark和Jmeter压测实践

image

3. 建立HTTP请求接口:

golang基准测试Benchmark和Jmeter压测实践

image

4. 建立监控器 数据展示

可以建立三个查看,一般我建立聚合报告看看就可以了。

golang基准测试Benchmark和Jmeter压测实践

image

聚合报告数据说明:

来看如图所示的数据:

中文版

golang基准测试Benchmark和Jmeter压测实践

image

英文版

golang基准测试Benchmark和Jmeter压测实践

image

这里我的线程数改变了 2 。

  • Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值

  • Samples:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100,每个用户只迭代一次就是10了。我这里自然是 2.

  • Average:平均响应时间(单位ms,1s=1000ms)——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间

  • Median:中位数,也就是 50% 用户的响应时间

  • 90% Line:90% 用户的响应时间

  • Min:最小响应时间

  • Max:最大响应时间

  • Error%:本次测试中出现错误的请求的数量/请求的总数

  • Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second),如果你的接口超过了每秒请求一次就会按照每分钟展示, 当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数

  • Received KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec

  • Send KB/Sec: 每秒向服务器端接发送的数据量。

所以如图中的线程数为2的测试中,平均每次响应时间为 554 毫秒相当于半秒,吞吐量为每秒处理了 1.9 次,额。。。很渣的性能。

因为这个接口本来就没有高并发场景要求,而且里面有个比较麻烦的递归查询操作很消耗性能的。

加大压力进行测试

那么如果出现较多的访问该接口,较高并发访问性能是如何的呢。

来个小 50 试试呢。

golang基准测试Benchmark和Jmeter压测实践

image

好吧,这个接口性能确实很差。。。平均一个接口处理要6s的时间。

具体分析原因:

  • 一个是递归耗性能
  • 另一个应该是Cassandra数据库I/O是性能瓶颈,pool可以从10调大到100试试。

将Cassandra连接池pool调为100压测数据

golang基准测试Benchmark和Jmeter压测实践

image

将线程数设置为200压测数据如下:

golang基准测试Benchmark和Jmeter压测实践

image

果然性能处理要好很多了。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 我们


推荐阅读
  • Java编程思想一书中第21章并发中关于线程间协作的一节中有个关于汽车打蜡与抛光的小例子(原书的704页)。这个例子主要展示的是两个线程如何通过wait ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 在Java中,我会做这样的事情:classPerson{privateRecordrecord;publicStringname(){record().get(name);}p ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • 基于分布式锁的防止重复请求解决方案
    一、前言关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同,如查 ... [详细]
  • SpringBoot简单日志配置
     在生产环境中,只打印error级别的错误,在测试环境中,可以调成debugapplication.properties文件##默认使用logbacklogging.level.r ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • Annotation的大材小用
    为什么80%的码农都做不了架构师?最近在开发一些通用的excel数据导入的功能,由于涉及到导入的模块很多,所以开发了一个比较通用的e ... [详细]
author-avatar
Era_zhou
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有