写点什么

架构师训练营第七周命题作业

发布于: 2020 年 11 月 09 日

作业一

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

  • 系统响应时间会逐渐增长,直至系统崩溃

  • 吞吐量会先增加(还没达到系统处理能力上线),后持平(达到处理能力上限),最后开始下降(超过上线)

作业二

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

代码

package main
import ( "github.com/montanaflynn/stats" "log" "net/http" "time")
type RequestResponse struct { TimeCost int64 Response *http.Response}
func main() { url := "https://www.baidu.com" method := "GET"
responses := batchRequest(1000, url, method) log.Println("", len(responses)) resultStats(responses)}
func resultStats(responses []*RequestResponse) { timeCosts := make([]float64, len(responses)) for i, resp := range responses { timeCosts[i] = float64(resp.TimeCost) } percentile, _ := stats.Percentile(timeCosts, 95) mean, _ := stats.Mean(timeCosts)
log.Printf("95-percentile: %.3f", percentile) log.Printf("average: %.3f", mean)}
func batchRequest(concurrency int, url string, method string) []*RequestResponse { ch := make(chan *RequestResponse, concurrency)
index := 0 for index < concurrency { go func(index int, url string, method string) { resp := doRequest(url, method) ch <- resp log.Println(index) }(index, url, method) index++ }
requestResponses := make([]*RequestResponse, concurrency) index = 0 for index < concurrency { requestResponses[index] = <-ch index++ }
return requestResponses}
func doRequest(url string, method string) *RequestResponse { startTs := time.Now() req, _ := http.NewRequest(method, url, nil) resp, _ := http.DefaultClient.Do(req) timeCost := time.Now().Sub(startTs).Milliseconds() return &RequestResponse{TimeCost: timeCost, Response: resp}}
复制代码

结果分析

并发为 10 时:

平均响应时间 = 383 毫秒

95 分位响应时间 = 386 毫秒

(结果有波动,有时候接近一秒)


并发为 1000 时:

平均响应时间 = 4435 毫秒

95 分位响应时间 = 6086 毫秒

(结果有波动)

发布于: 2020 年 11 月 09 日阅读数: 30
用户头像

还未添加个人签名 2018.07.26 加入

还未添加个人简介

评论

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