写点什么

week7-homework

用户头像
J
关注
发布于: 2021 年 01 月 10 日

作业一


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


随着并发压力增加,系统响应时间逐渐变大,因为在固定资源下,随着请求量增加,每个请求能够分配到的资源时间会变少,那么该请求的响应时间就会被拉长。但是吞吐量会先变大然后变小,因为 吞吐量 = ( 1000 / 响应时间ms ) × 并发数,在负载不是很大的时候,因为并发数增加的增益大于响应时间变长的损耗,所以前期吞吐量是在上升,但当负载很高时,并发数无法继续增加,而响应时间却在不断变长,所以吞吐量就开始下降,这时候系统已经过载,甚至可能会崩溃。




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


// main.gopackage main
func main() { url := "https://www.baidu.com" Checker(CheckWebsite, url, 10, 100)}
复制代码


// checker.go 进行单次的url测试,返回结果package main
import ( "fmt" "net/http" "time")
// CheckWebsite is check the url by http GET, and check the// response and errorfunc CheckWebsite(url string) (time.Duration, error) { start := time.Now() resp, err := http.Get(url)
if err != nil { return 0, err }
if resp.StatusCode != http.StatusOK { return 0, fmt.Errorf("status code %d", resp.StatusCode) }
return time.Since(start), nil}
复制代码


// benchmark.go 压测的主体逻辑package main
import ( "fmt" "sort" "time")
type websitechecker func(url string) (time.Duration, error)
type result struct { time.Duration error}
// Checker 对目标url进行压力测试func Checker(wc websitechecker, url string, concurrency int, times int) { resultChannel := make(chan result) // 收集结果 durations := []time.Duration{} var sum time.Duration
// 并发执行压力测试 for i := 0; i < times; i++ { for j := 0; j < concurrency; j++ { go func(u string) { duration, err := wc(u) resultChannel <- result{duration, err} }(url) }
for j := 0; j < concurrency; j++ { ret := <-resultChannel if ret.error != nil { fmt.Printf("error %v", ret.error) continue } durations = append(durations, ret.Duration) sum += ret.Duration } }
// 排序和统计结果 sort.Slice(durations, func(i, j int) bool { return durations[i] < durations[j] }) errorCount := concurrency*times - len(durations) p95 := len(durations) * 95 / 100
// 输出结果 fmt.Printf("successed %d, error %d, avg time %v ms, p95 = %v", len(durations), errorCount, int(sum.Microseconds())/len(durations)/1000, durations[p95])}
复制代码


测试结果


09:02 $ ./wbsuccessed 1000, error 0, avg time 121 ms, p95 = 124.7861ms
复制代码


用户头像

J

关注

还未添加个人签名 2015.06.24 加入

还未添加个人简介

评论

发布
暂无评论
week7-homework