1. 性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?
系统响应时间:
随着并发数的增加,一开始系统响应时间无变化,然后开始缓慢上升,当超过系统最大负载点时,会急剧上升,直到系统崩溃。
原因:系统响应时间一开始无变化,是因为并发量不大,系统能完全处理这些并发,并未出现资源争抢情况,对于每个请求来说,系统是完全为自己服务的,因此响应时间和单个请求是一致的。当并发量达到需要某些少量请求需排队等待处理时,响应时间会出现缓慢上升,是增加了每个请求平均等待时间。并发量达到系统最大负载,每个请求都需要等待处理,更多的请求,只会导致等待时间更久,响应时间就会急剧升高,直到响应时间达到排队超时时间时,大部分请求遭到抛弃返回错误,造成系统崩溃。
吞吐量:
随着并发数的增加,一开始吞吐量是线性增加,然后增加速度开始下降,当超过系统最大负载点时,吞吐量急剧下降。
原因:一开始,系统资源足够,能完全处理新增的并发数,因此,增加多少并发,吞吐量就能提升多少,这时候是线性增加的。之后再增加并发数,有一些请求开始出现排队等待,这时候吞吐量的提升就达不到线性了,会出现下降。当达到系统最大负载时,所有的请求都出现了等待,此时吞吐量达到最大。再增加并发数,只会延长等待时间,直到等待时间达到请求超时时间后,大量请求被抛弃,此时成功执行的请求反而因为超时而变少,吞吐量急剧下降。
2. 用你熟悉的编程语言写一个 Web 性能压测工具,输入参数:URL,请求总次数,并发数。输出参数:平均响应时间,95% 响应时间。用这个测试工具以 10 并发、100 次请求压测 www.baidu.com。
# performance_test.rb
require "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.rb
require '../lib/performance_test.rb'
test = PerformanceTest.new('www.baidu.com', 100, 10)
test.start
# result
url: www.baidu.com total_request: 100 thread_num: 10
avarage respond time: 0.055 s
95% respond time: 0.071 s
复制代码
评论