架构师第 7 周作业
性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?
随着并发压力的增加,系统响应时间如图成曲线上升,在 b 点之前近似横线,过了 b 点开始上升,过了 C 点急剧上升,而吞吐量在 b 点之前近似线性增加,过了 b 点增加变缓,过了 c 点开始下降。这是因为,一开始服务器资源充裕,每个线程都可以得到调度,cpu/mem/disk/net 资源都够用,不会有阻塞,所以请求快速处理完,并发数越多,处理的请求越多,TPS 越高,当过了某个点,比如线程数超过了 CPU 数,有些线程得不到调度,需要排队等待,响应开始变慢,如果接着增加压力,更多的请求进来,更多的资源被消耗了,比如内存资源如果消耗尽了,请求再进来,就需要用硬盘来虚拟内存,时间就花在了虚拟内存置换上了,随着各种资源的耗尽,花在等待各种资源的时间越来越多,直至系统崩溃。
用你熟悉的编程语言写一个 Web 性能压测工具,输入参数:URL,请求总次数,并发数。输出参数:平均响应时间,95% 响应时间。用这个测试工具以 10 并发、100 次请求压测 www.baidu.com。
import sys
import requests
from datetime import datetime
import threading
class stress_test:
def init(self, url, count, iteration, checkpoint):
self.url = url
self.count = int(count)
self.iteration = int(iteration)
self.checkpoint = int(checkpoint)
self.duration = []
def test(self):
begin = datetime.timestamp(datetime.now())
requests.get(self.url)
end = datetime.timestamp(datetime.now())
self.duration.append(end-begin)
print(self.duration)
def stress(self):
tasks = []
for i in range(0,self.count):
task = threading.Thread(target=self.test)
task.start()
tasks.append(task)
for task in tasks:
task.join()
def run(self):
for i in range(0,self.iteration):
self.stress()
def print_result(self):
self.duration.sort()
print(self.duration[self.checkpoint])
print(sum(self.duration)/len(self.duration))
if name == "main":
st = stress_test(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])
st.run()
st.print_result()
**********************************
output:
1.46537184715271
0.6422280716896057
评论