写点什么

架构师训练营第七周 - 作业

用户头像
Eric
关注
发布于: 2020 年 07 月 21 日
架构师训练营第七周 - 作业
  1. 性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?



响应时间曲线



吞吐量曲线



在开始阶段,随着并发请求数目的增加,系统使用较少的资源就达到较好的处理能力(a~b段),这一段是网站的日常运行区间,网站的绝大部分访问负载压力都集中在这一段区间,被称作性能测试,测试目标是评估系统性能是否符合需求及设计目标。



随着压力的持续增加,系统处理能力增加变缓,直到达到一个最大值(c点),这是系统的最大负载点,这一段被称作负载测试。测试目标是评估当系统因为突发事件超出日常访问压力的情况下,保证系统正常运行情况下能够承受的最大访问负载压力。



超过这个点后,再增加压力,系统的处理能力反而下降,而资源消耗却更多,直到资源消耗达到极限(d点),这个点可以看作是系统的崩溃点,超过这个点继续加大并发请求数目,系统不能再处理任何请求,这一段被称作压力测试,测试目标是评估可能导致系统崩溃的最大访问负载压力。



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



GitHub - gzeureka/load-tester

Clojure 代码

(ns load-tester.core
(:gen-class)
(:refer-clojure :exclude [time])
(:require [clojure.core.async :refer (thread <!!)]
[org.httpkit.client :as http]
)
)
(defmacro time
"对表达式求值并计算执行时间,返回执行时间(毫秒为单位)及表达式的值"
[expr]
`(let [start# (. System (nanoTime))
ret# ~expr]
{:time (/ (double (- (. System (nanoTime)) start#)) 1000000.0)
:ret ret#
}
)
)
(defn access-url "访问 url" [url]
(let [{:keys [status headers body error] :as resp} @(http/get url)]
(not error)
)
)
(defn time-access-url "访问 url,记录响应时间" [url]
(time (access-url url))
)
(defn test-url "访问 url 若干次,记录每次的响应时间" [url times]
(doall (repeatedly times #(time-access-url url)))
)
(defn percentile "计算百分位" [coll p]
(nth (sort coll) (int (/ (* (count coll) p) 100)))
)
(defn -main [arg1 arg2 arg3 & args]
(let [;; 并线程数
concurrency (Integer/valueOf arg1)
;; 每个线程请求数
times (Integer/valueOf arg2)
;; 百分位
p (Integer/valueOf arg3)
url "https://www.baidu.com"
results (->> (repeatedly concurrency #(<!! (thread (test-url url times))))
flatten
(map :time)
)
sorted-results (sort results)
average-time (/ (apply + results) (* concurrency times))
]
(println (format "average: %sms min: %sms max: %sms" average-time (first sorted-results) (last sorted-results)))
(println (format "%dth percentile: %sms" p (percentile results p)))
)
)



测试结果

➜ lein run 10 100
average: 11.067140267000005ms min: 8.943479ms max: 187.379443ms
95th percentile: 12.231237ms




用户头像

Eric

关注

给写代码的人写代码 2017.10.17 加入

Clojure

评论

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