go 语言实现 web 性能压测工具
发布于: 2020 年 07 月 17 日
输入参数:URL,请求总次数,并发数
package mainimport ( "fmt" "net/http" "os" "sort" "strconv" "sync" "time")type resData struct { duration float32 status int}var wg sync.WaitGroupfunc res(url string, ch chan<-resData) { var status int startTime := time.Now().UnixNano() timeout := time.Duration(time.Second) client := http.Client{ Timeout: timeout, } reqData, err := client.Get(url) duration := float32(time.Now().UnixNano()-startTime) / 1000000 if err != nil{ status = 0 } else { status = reqData.StatusCode _ = reqData.Body.Close() } ch <- resData{ duration: duration, status: status, } wg.Done()}func main() { startTime := time.Now().UnixNano() args := os.Args[1:] if len(args) < 3 { fmt.Println("参数不足,eg:https://www.baidu.com/ 100 10") return } url := args[0] reqTotalNum, err := strconv.Atoi(args[1])//请求总次数 if err != nil { fmt.Println("请求总次数(第二个)参数错误,应该是整数") return } concurrentNum, err := strconv.Atoi(args[2])//并发数 if err != nil { fmt.Println("并发数(第三个)参数错误,应该是整数") return } if reqTotalNum%concurrentNum!=0 { fmt.Println("并发数与请求次数应该是倍数关系") return } times:=reqTotalNum/concurrentNum resChan := make(chan resData, reqTotalNum) for j := 0; j < times; j++ { for i := 0; i < concurrentNum; i++ { wg.Add(1) go res(url, resChan) } wg.Wait() fmt.Println("第",j,"次并发请求",len(resChan)) } close(resChan) calAndExport(resChan) fmt.Println("本次执行时间:",float32(time.Now().UnixNano()-startTime) / 1000000,"毫秒")}func calAndExport(ch chan resData){ fmt.Println("管道内元素数量",len(ch)) var sum, resRate float32 var count = 0 var res95 []float64 var wrongNum int for v := range ch { if v.status == 200 { sum += v.duration count++ res95 = append(res95, float64(v.duration)) } else { wrongNum++ //fmt.Println(v) } } avg := sum / float32(count) sort.Float64s(res95) key := int(float32(len(res95)) * 0.95) if res95 != nil { resRate = float32(res95[key]) } else { resRate = float32(0) } fmt.Println("平均响应时间:",avg) fmt.Println("95%响应时间:",resRate) fmt.Println("异常返回次数:",wrongNum)}
以下是以百度首页为目标进行压测的结果
命令如下
go run main.go https://www.baidu.com/ 100 10
结果集
第 0 次并发请求 10第 1 次并发请求 20第 2 次并发请求 30第 3 次并发请求 40第 4 次并发请求 50第 5 次并发请求 60第 6 次并发请求 70第 7 次并发请求 80第 8 次并发请求 90第 9 次并发请求 100管道内元素数量 100平均响应时间: 99.7840895%响应时间: 376.387异常返回次数: 1本次执行时间: 2008.433 毫秒
为什么正文不少于50个字
划线
评论
复制
发布于: 2020 年 07 月 17 日阅读数: 74
版权声明: 本文为 InfoQ 作者【任小龙】的原创文章。
原文链接:【http://xie.infoq.cn/article/92da16caea1fd6f778618a2ed】。文章转载请联系作者。
任小龙
关注
还未添加个人签名 2019.02.11 加入
还未添加个人简介
评论