写点什么

架構師訓練營 week7 作業

用户头像
ilake
关注
发布于: 2020 年 11 月 08 日

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



系統響應時間:系統發出請求到得到回覆所花的時間

吞吐量:單位時間內系統能夠處理的請求數量



性能壓測的時候,隨著併發數的增加,響應時間如下的變化:
  1. 最佳運行點之前,資源充足,可以快速處理需求,響應時間低

  2. 最大負載點之前,資源逐漸不足,後面的請求需要等待前面的請求完成才能處理,響應時間開始增加

  3. 超過最大負載到崩潰前,資源嚴重不足,CPU高載,大量請求等待,響應時間極速增加

  4. 超過系統崩潰點,無法處理任何請求



性能壓測的時候,隨著併發數的增加,吞吐量如下的變化:
  1. 最佳運行點之前,併發數低,處理速度快,單位時間內處理的請求多

  2. 最大負載點之前,系統處理速度逐漸變慢,但單位時間內能處理的數量持續增加,在到最大負載點之前,吞吐量會到最大值

  3. 超過最大負載到崩潰前,資源嚴重不足,單位時間吞吐量會下降

  4. 超過系統崩潰點,當機,無吞吐量



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

source code

require 'typhoeus'
class LoadTest
def initialize(url, test_count, concurrent, percentile=0.95)
@url = url
@test_count = test_count.to_i
@concurrent = concurrent.to_i
@percentile = percentile
end
def run
total_responses = @test_count.times.map { parallel_request }
parsing_response_time(total_responses.flatten)
[@avg_response_time, @percentile_response_time]
end
private
def parallel_request
hydra = Typhoeus::Hydra.new
requests = @concurrent.times.map do
request = Typhoeus::Request.new(@url, followlocation: true)
hydra.queue(request)
request
end
hydra.run
requests.map { |request| request.response }
end
def parsing_response_time(responses)
response_times = responses.map(&:total_time)
calculate_avg_response_time(response_times)
calculate_percentile(response_times)
end
def calculate_avg_response_time(response_times)
@avg_response_time = response_times.sum / (@test_count * @concurrent)
end
def calculate_percentile(values)
values_sorted = values.sort
k = (@percentile*(values_sorted.length-1)+1).floor - 1
f = (@percentile*(values_sorted.length-1)+1).modulo(1)
@percentile_response_time = values_sorted[k] + (f * (values_sorted[k+1] - values_sorted[k]))
end
end

execute load_test.rb

url = 'www.baidu.com'
test_count = 100
concurrent = 10
percentile = 0.95
result = LoadTest.new(url, test_count, concurrent, percentile).run
avg_response_time = result[0]
percentile_response_time = result[1]
puts "avg_response_time: #{avg_response_time}"
puts "percentile_response_time: #{percentile_response_time}"

result



平均响应时间: 0.45257322499999997秒

95% 响应时间: 0.7132899秒



用户头像

ilake

关注

还未添加个人签名 2019.04.15 加入

还未添加个人简介

评论

发布
暂无评论
架構師訓練營 week7 作業