写点什么

架构师训练营第 0 期第 7 周作业

用户头像
无名氏
关注
发布于: 2020 年 07 月 22 日

作业一:

以下两题,至少选做一题

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

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



第二题

// web-stress-testing.go
package stress_testing
import (
"net/http"
"sort"
"sync"
"time"
)
type StressTestingRunner interface {
Run(url string, request int, concurrent int) (int64, int64)
}
type WebStressTestingRunner struct {
}
func NewStressTestingRunner() StressTestingRunner {
return &WebStressTestingRunner{}
}
func (r *WebStressTestingRunner) Run(url string, request int, concurrent int) (int64, int64) {
elapsedTimes := make([]time.Duration, 0, request)
for i := 0; i < request/concurrent; i++ {
elapsedTimes = append(elapsedTimes, r.run(url, concurrent)...)
}
if request%concurrent > 0 {
elapsedTimes = append(elapsedTimes, r.run(url, request%concurrent)...)
}
elapsedNanoseconds := make([]int64, request)
for i, elapsed := range elapsedTimes {
elapsedNanoseconds[i] = elapsed.Nanoseconds()
}
sort.Slice(elapsedNanoseconds, func(i, j int) bool {
return elapsedNanoseconds[i] < elapsedNanoseconds[j]
})
var sum int64
for _, elapsed := range elapsedNanoseconds {
sum += elapsed
}
p50 := sum / int64(request)
p95 := elapsedNanoseconds[int(float64(request)*0.95)-1]
return p50, p95
}
func (r *WebStressTestingRunner) run(url string, request int) []time.Duration {
wg := sync.WaitGroup{}
elapsedTimes := make([]time.Duration, 0, request)
for i := 0; i < request; i++ {
wg.Add(1)
go func() {
start := time.Now()
// ignore response and error
http.Get(url)
elapsedTimes = append(elapsedTimes, time.Since(start))
wg.Done()
}()
}
wg.Wait()
return elapsedTimes
}
// web-stress-testing_test.go
package stress_testing
import "testing"
func TestWebStressTestingRunner_Run(t *testing.T) {
runner := NewStressTestingRunner()
url := "https://www.baidu.com"
request := 100
concurrent := 10
for i := 0; i < 5; i++ {
p50, p95 := runner.Run(url, request, concurrent)
t.Logf("WebStressTesting: url=%s, request=%d, concurrent=%d, p50=%dns, p95=%dns\n", url, request, concurrent, p50, p95)
}
}
// output
=== RUN TestWebStressTestingRunner_Run
TestWebStressTestingRunner_Run: web-stress-testing_test.go:12: WebStressTesting: url=https://www.baidu.com, request=100, concurrent=10, p50=166807071ns, p95=467995313ns
TestWebStressTestingRunner_Run: web-stress-testing_test.go:12: WebStressTesting: url=https://www.baidu.com, request=100, concurrent=10, p50=386995794ns, p95=1422057192ns
TestWebStressTestingRunner_Run: web-stress-testing_test.go:12: WebStressTesting: url=https://www.baidu.com, request=100, concurrent=10, p50=106412302ns, p95=151324861ns
TestWebStressTestingRunner_Run: web-stress-testing_test.go:12: WebStressTesting: url=https://www.baidu.com, request=100, concurrent=10, p50=267705842ns, p95=1020937437ns
TestWebStressTestingRunner_Run: web-stress-testing_test.go:12: WebStressTesting: url=https://www.baidu.com, request=100, concurrent=10, p50=126596884ns, p95=158419194ns
--- PASS: TestWebStressTestingRunner_Run (14.22s)
PASS
Process finished with exit code 0



作业二:

根据当周学习情况,完成一篇学习总结。



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

  • 性能测试

  • 全链路压测

  • 案例分析

  • 软件性能优化的两个原则

  • 你不能优化一个没有测试的软件

  • 你不能优化一个你不了解的软件

  • 操作系统

  • 文件与磁盘IO

  • 数据结构与算法

  • 网络通信协议

  • 非阻塞网络IO

  • 数据库架构原理及性能优化

  • JVM虚拟机原理及编程优化

  • Java代码优化

  • 秒杀



用户头像

无名氏

关注

还未添加个人签名 2017.09.11 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第 0 期第 7 周作业