写点什么

架构师训练营作业 -web 性能压测示例代码

用户头像
superman
关注
发布于: 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



用户头像

superman

关注

还未添加个人签名 2018.07.20 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营作业-web性能压测示例代码