架构训练营第七周作业

用户头像
一期一会
关注
发布于: 2020 年 12 月 07 日



作业一:

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



解答:

系统响应时间和吞吐量的变化,根据并发数对于硬件资源压力的不同,分为三个阶段。如下图:

图1



图2



性能测试阶段

这个阶段里面,硬件资源还比较富余,也就是说并发还没有完全消耗所有的系统资源。这时候,吞吐量会随着并发数增加而增加,大致呈线性增长。对应图1的a点到b点。



而响应时间则近似保持水平,每个请求都几乎能在最小时间内得到响应。对应图2的起始到b点

负载测试阶段

到达这个阶段以后,硬件资源已经不能完全覆盖所有并发,开始有时间片切换。但是吞吐量还能继续上升,这是因为这个阶段,随着并发增加,可以逐渐把CPU的性能全部发挥出来。但是从图上看,已经从近似直线变成了曲线。对应图1中b点到c点



由于有了时间片切换,有的并发需要等待上下文切换等,响应时间会开始边长。对应图2中b到c点



压力测试阶段

当并发继续增加,CPU时间片切换越来越多。而且这时有可能因为内存不足,需要使用swap或虚拟内存来置换内存,CPU会花很多额外的时间来处理。吞吐量开始从最高点下降,并且一般速度会随着并发增加,下降得很快。对应图1的c点到d点。



响应时间则会大幅增加,因为置换内存等操作特别耗时。对应图2,从c点开始,响应时间大幅增加。当响应时间超过设置的超时时间,也就差不多到了系统崩溃点(d点)



作业二:

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



解答:

运行结果

运行代码截图如下:



命令接受3个参数,URL,请求总次数,并发数;输出参数:平均响应时间,95% 响应时间。



源码实现

使用了go语言。httpGet实现如下:

func httpGet(url string) int {
start := time.Now()
resp, err := http.Get(url)
if err != nil {
// handle error
}
tc := time.Since(start)
defer resp.Body.Close()
return int(tc.Milliseconds())
}

用于实现并发和多次调用的方法如下:

func callRunners(url string, times, runners int) []int {
res := make([]int, times)
var reqChan = make(chan int)
avgTimes := times / runners
for i := 0; i < runners; i++ {
go repeat(url, avgTimes, reqChan)
}
for i := range res {
res[i] = <-reqChan
}
return res
}
func repeat(url string, times int, getter chan int) {
for i := 0; i < times; i++ {
getter <- httpGet(url)
}
}

入口main方法:

func main() {
if len(os.Args) != 4 {
fmt.Fprintf(os.Stderr, "输入参数:url 总请求数 并发数\n", os.Args[0])
os.Exit(1)
}
url := os.Args[1]
var times, runners int
var err error
if times, err = strconv.Atoi(os.Args[2]); err != nil {
fmt.Fprintf(os.Stderr, "总请求数必须为数字,输入值为:\n", os.Args[2])
os.Exit(1)
}
if runners, err = strconv.Atoi(os.Args[3]); err != nil {
fmt.Fprintf(os.Stderr, "并发数必须为数字,输入值为:\n", os.Args[3])
os.Exit(1)
}
res := callRunners(url, times, runners)
sort.Ints(res)
total := 0
for _, v := range res {
total += v
}
fmt.Println("平均时间:", total/times)
fmt.Println("95% 响应时间:", res[95])
}



发布于: 2020 年 12 月 07 日阅读数: 46
用户头像

一期一会

关注

还未添加个人签名 2018.01.08 加入

还未添加个人简介

评论

发布
暂无评论
架构训练营第七周作业