架构师训练营作业 -web 性能压测示例代码
发布于: 2020 年 07 月 22 日
1:题目
用熟悉的编程语言写web性能压测工具,输入url,请求总次数,并发数。输出平均响应时间,95%响应时间
。用该工具以10并发,100次请求压测 www.baidu.con
2: 代码
用golang 实现。
性能测试代码
输入url,请求总次数,并发数,反馈平均耗时,95%耗时,失败请求数(失败请求不计入耗时)
//输入url,请求总次数,并发数,反馈平均耗时,95%耗时,失败请求数(失败请求不计入耗时)func DoHttpPressureTest(url string ,testCount ,concurrentSize int)(averageSpan ,p95Span, failCount int){ //runtime.GOMAXPROCS(runtime.NumCPU()) runtime.GOMAXPROCS(concurrentSize) f:=DoHttpTest ready:=make(chan struct{}) results:=make(chan TestResult,concurrentSize) var wg sync.WaitGroup wg.Add(concurrentSize) pTestCount:=testCount/concurrentSize //每个线程执行的测试次数 for t:=0;t<concurrentSize;t++{ go func(){ defer wg.Done() <-ready var failCount =0 var timeSpan []int for i:=0;i<pTestCount;i++{ if ok,span:=f(url);ok{ timeSpan= append(timeSpan, span) } } //收集测试结果 result:=TestResult{failCount:failCount,span:timeSpan} results<-result }() } time.Sleep(time.Second) close(ready) wg.Wait() close(results) //所有测试结果合并,统计 var totalResul TestResult for result:=range results{ totalResul.add(&result) } return totalResul.GetSpanStatistic()}
辅助类
http请求测试代码:输入url,反馈测试是否成功,与耗时(ms)
func DoHttpTest(url string) (success bool,timespan int){ begin:=GetCurrentTimestamp() if resp,err:=http.Get(url);err!=nil{ return false,0 }else{ defer resp.Body.Close() if resp.StatusCode==200{ end:=GetCurrentTimestamp() timespan=int(end-begin) return true,timespan } return false ,0 }}//获取当前时间毫秒func GetCurrentTimestamp() int64 { return time.Now().UnixNano() / 1e6}
辅助类:测试结果统计
//测试结果记录type TestResult struct { failCount int span []int //所有成功请求耗时记录(ms )}func(this *TestResult)add(newResult *TestResult){ this.failCount=newResult.failCount this.span= append(this.span, newResult.span...)}//耗时统计:平均耗时,95%耗时,失败记录数func (this *TestResult)GetSpanStatistic()(averageSpan ,p95Span ,failCount int){ var successCount =len(this.span) sort.Ints(this.span) total:=0 for _,s:=range this.span{ fmt.Println(s) total+=s } averageSpan =total/ successCount p95Count :=successCount*95/100 if p95Count>0{ p95Total:=0 for i:=0;i<p95Count;i++{ p95Total+=this.span[i] } p95Span=p95Total/p95Count } return averageSpan,p95Span,this.failCount}
测试及测试结果
测试调用:
func main(){ doHttpTest4Baidu(100,10)}func doHttpTest4Baidu(testCount,concurrentSize int ){ averageSpan,p95Sapan,failCount:=pressuretest.DoHttpPressureTest("http://www.baidu.com",testCount,concurrentSize) s:=fmt.Sprintf("并发数%d,平均响应时间%d ms,p95响应时间 %d ms,总请求数%d 总失败数%d",concurrentSize,averageSpan,p95Sapan,testCount,failCount) fmt.Println(s)}
测试结果:
并发数10,平均响应时间81 ms,p95响应时间 50 ms,总请求数100 总失败数0
代码:https://github.com/juluzhch/studygo/tree/master/src/jiagoushi/homework/pressuretest
划线
评论
复制
发布于: 2020 年 07 月 22 日阅读数: 54
superman
关注
还未添加个人签名 2018.07.20 加入
还未添加个人简介
评论