写点什么

第七周 - 作业 1

发布于: 2020 年 12 月 13 日

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

  • 在资源充足的情况下,并发增加,系统响应时间维持在一个较低水平;

  • 当并发数增加到一定大小,系统资源紧张导致阻塞与等待,响应时间增长加快;

  • 当并发数增加到一个临界点,系统资源耗尽,大量请求阻塞,响应时间急剧加大,直至系统崩溃

  • 在资源充足的情况下,TPS 随并发数基本维持线性增长;

  • 当并发数增加到一定大小,系统资源无法支撑系统的吞吐量增长的态势,TPS 增长变缓;

  • 当并发数增加到一个临界点,系统资源耗尽,没有更多资源用来处理用户请求,此时系统吞吐量不增反降,直到系统资料耗尽,系统崩溃


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

package main
import ( "fmt" "net/http" "sort" "sync" "time")
type respData struct { duration float32 status int}
var wg sync.WaitGroup

func PressureTesting(url string, TotalNum, concurrentNum int) { startTime := time.Now().UnixNano() times := TotalNum/concurrentNum resChan := make(chan respData, TotalNum) for j := 0; j < times; j++ { for i := 0; i < concurrentNum; i++ { wg.Add(1) go Testing(url, resChan) } wg.Wait() fmt.Println("第",j,"次并发请求",len(resChan)) } close(resChan) testResultTime(resChan) fmt.Println("本次执行时间:",float32(time.Now().UnixNano()-startTime) / 1000000,"毫秒")}
func Testing(url string, ch chan<-respData) { 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 <- respData{ duration: duration, status: status, } wg.Done()}
func testResultTime(ch chan respData) { fmt.Println("管道内元素数量", len(ch)) var sum, timeCount95 float32 var count = 0 var Count95s []float64 var wrongNum int for v := range ch { if v.status == 200 { sum += v.duration count++ Count95s = append(Count95s, float64(v.duration)) } } avg := sum / float32(count) sort.Float64s(Count95s) cutKey := int(float32(len(Count95s)) * 0.95) if Count95s != nil { timeCount95 = float32(Count95s[cutKey]) } else { timeCount95 = float32(0) } fmt.Println("平均响应时间:",avg) fmt.Println("95%响应时间:",timeCount95) fmt.Println("异常返回次数:",wrongNum)}
func main() { PressureTesting("https://www.baidu.com/", 100, 10)}
复制代码



用户头像

还未添加个人签名 2019.09.13 加入

还未添加个人简介

评论

发布
暂无评论
第七周-作业1