写点什么

第 7 周 性能优化:性能优化是架构师展现自己技术全面性的时刻

用户头像
陆不得
关注
发布于: 2020 年 07 月 22 日

1、性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?

1、并发较小时,系统负载比较低,系统响应时间比较平稳。并发越增加,吞吐量越大。

2、并发到达系统负荷时,增加并发,系统响应时间变长,吞吐量保持平稳

3、并发超过系统负荷时,系统响应时间越来越长。吞吐量开始下降,直到系统崩溃

2、用你熟悉的编程语言写一个 web 性能压测工具,输入参数:URL,请求总次数,并发数。输出参数:平均响应时间,95% 响应时间。用这个测试工具以 10 并发、100 次请求压测 www.baidu.com。



package main

import (
"flag"
"fmt"
"io/ioutil"
"math"
"net/http"
"sort"
"sync"
"time"
)

func main() {
var n ,c int64
var url string
flag.Int64Var(&n, "n", 0, "请求总数")
flag.Int64Var(&c,"c", 0, "请求并发数")
flag.StringVar(&url, "url", "", "请求地址")
flag.Parse()
mod := int64(math.Mod(float64(n), float64(c)))
num := int64(math.Floor(float64(n/c)))
wg := &sync.WaitGroup{}
wg.Add(int(c))
var m sync.Mutex
statData := []int64{}
totalTime := int64(0)
for i:=int64(0); i< c;i++{
requestNum := num
if i < mod {
requestNum += 1
}
go run(requestNum, url, wg, func(t int64) {
m.Lock()
defer m.Unlock()
totalTime += t
statData = append(statData, t)
})
}
wg.Wait()
sort.Slice(statData, func(i, j int) bool { return statData[i] < statData[j] })
index := int64(math.Max(math.Round(0.95 * float64(n)) - 1, 0))
fmt.Printf("[总请求数:%d、 并发数:%d ]测试结果:平均响应时间:%s、 95%s响应时间:%s \n", n, c, time.Duration(totalTime/n).String(), "%",time.Duration(statData[index]).String())

}

func run(num int64, url string, wg *sync.WaitGroup, callback func(t int64)) {
for i:=int64(0); i < num; i++ {
startTime := time.Now()
curl(url)
elapsedTime := time.Since(startTime)
callback(elapsedTime.Nanoseconds())
}
wg.Done()
}

func curl(url string) ([]byte, int) {
resp,_ := http.Get(url)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
return body, resp.StatusCode
}



go run test.go -c 10 -n 100 -url "http://www.baidu.com"



[总请求数:100、 并发数:10 ]测试结果:平均响应时间:85.137627ms、 95%响应时间:145.384639ms



用户头像

陆不得

关注

还未添加个人签名 2017.12.14 加入

还未添加个人简介

评论

发布
暂无评论
第7周 性能优化:性能优化是架构师展现自己技术全面性的时刻