写点什么

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

用户头像
李循律
关注
发布于: 2020 年 11 月 09 日

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

系统响应时间:

随着并发数的增加,一开始系统响应时间无变化,然后开始缓慢上升,当超过系统最大负载点时,会急剧上升,直到系统崩溃。

原因:系统响应时间一开始无变化,是因为并发量不大,系统能完全处理这些并发,并未出现资源争抢情况,对于每个请求来说,系统是完全为自己服务的,因此响应时间和单个请求是一致的。当并发量达到需要某些少量请求需排队等待处理时,响应时间会出现缓慢上升,是增加了每个请求平均等待时间。并发量达到系统最大负载,每个请求都需要等待处理,更多的请求,只会导致等待时间更久,响应时间就会急剧升高,直到响应时间达到排队超时时间时,大部分请求遭到抛弃返回错误,造成系统崩溃。


吞吐量:

随着并发数的增加,一开始吞吐量是线性增加,然后增加速度开始下降,当超过系统最大负载点时,吞吐量急剧下降。

原因:一开始,系统资源足够,能完全处理新增的并发数,因此,增加多少并发,吞吐量就能提升多少,这时候是线性增加的。之后再增加并发数,有一些请求开始出现排队等待,这时候吞吐量的提升就达不到线性了,会出现下降。当达到系统最大负载时,所有的请求都出现了等待,此时吞吐量达到最大。再增加并发数,只会延长等待时间,直到等待时间达到请求超时时间后,大量请求被抛弃,此时成功执行的请求反而因为超时而变少,吞吐量急剧下降。


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

# performance_test.rbrequire "net/http"
class PerformanceTest @url @total_request @thread_num @respond_times
def initialize(url, total_request, thread_num) @url = url @total_request = total_request @thread_num = thread_num @respond_times = [] end
def start threads = [] @thread_num.times do |i| threads << make_thread end threads.each(&:join) print_result end
def make_thread Thread.new { (@total_request / @thread_num).times do |j| b_time = Time.now respons = response = Net::HTTP.get_response('www.baidu.com', '/') e_time = Time.now @respond_times << (e_time - b_time).round(3) end } end
def print_result average = (@respond_times.sum * 1.0 / @respond_times.size).round(3) sorted = @respond_times.sort index_of_95 = (@respond_times.size * 0.95).round(0) puts "url: #{@url} total_request: #{@total_request} thread_num: #{@thread_num}" puts "avarage respond time: #{average} s" puts "95% respond time: #{sorted[index_of_95]} s" end
end
# test.rbrequire '../lib/performance_test.rb'
test = PerformanceTest.new('www.baidu.com', 100, 10)test.start

# result url: www.baidu.com total_request: 100 thread_num: 10avarage respond time: 0.055 s95% respond time: 0.071 s
复制代码


用户头像

李循律

关注

还未添加个人签名 2018.05.23 加入

还未添加个人简介

评论

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