性能测试 - 第七周作业
发布于: 2020 年 07 月 21 日
1、性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?
并发数<=系统最佳性能并发数
系统的响应时间:无明显变化
吞吐量:直线上升
系统最佳性能并发数<并发数<=系统承受的最大并发数
系统的响应时间:明显变大
吞吐量:达到顶峰
并发数>系统承受的最大并发数
系统的响应时间:取向无穷大
吞吐量:取向0
2、用你熟悉的编程语言写一个 web 性能压测工具,输入参数:URL,请求总次数,并发数。输出参数:平均响应时间,95% 响应时间。用这个测试工具以 10 并发、100 次请求压测 www.baidu.com。
该工具包含了 请求类、压力测试类,具体的关系如下图。
<?phpinterface IRequest{ public function request():Response;}class Response { private $code; private $responseTime; /** * Response constructor. * @param $code * @param $responseTime */ public function __construct($code, $responseTime) { $this->code = $code; $this->responseTime = $responseTime; } /** * @return mixed */ public function getCode() { return $this->code; } /** * @return mixed */ public function getResponseTime() { return $this->responseTime; } public function isSuccess() { return $this->code == 200; }}class GetRequest implements IRequest{ private $url; private $host; private $scheme; private $port = 80; private $path = ''; public function __construct($url) { $this->url = $url; $parseUrl = parse_url($this->url); $this->host = $parseUrl['host']; $this->path = isset($parseUrl['path'])?$parseUrl['path']:'/'; $this->scheme = $parseUrl['scheme']; if ($this->scheme == 'https') { $this->port = 443; } } /** * @return Response */ public function request():Response { $cli = new \Swoole\Coroutine\Http\Client($this->host, 443, true); $cli->setHeaders([ 'Host' => $this->host, 'User-Agent' => 'Chrome/49.0.2587.3', 'Accept' => 'text/html,application/xhtml+xml,application/xml', 'Accept-Encoding' => 'gzip', ]); $cli->set(['timeout' => 1]); $startTime = microtime(true); $cli->get($this->path); $endTime = microtime(true); $responseTime = ceil(($endTime - $startTime)*1000); return new Response($cli->getStatusCode(), $responseTime); }}class PressureTest{ /** * @var IRequest */ private $request; private $responseTimes = []; /** * Tests constructor. * @param IRequest $request */ public function __construct(IRequest $request) { $this->request = $request; } public function addResponseTime($responseTime) { $this->responseTimes[] = $responseTime; sort($this->responseTimes); } public function getAvgResponseTime() { return array_sum($this->responseTimes)/count($this->responseTimes); } public function getPercentageResponseTime($number = 95) { $key = ceil(count($this->responseTimes) * 95/100); return $this->responseTimes[$key]; } public function run($concurrencyCount, $requestCount) { Swoole\Coroutine\run(function() use($concurrencyCount, $requestCount) { $startTime = microtime(true); $i = $requestCount; while($i>=1) { $wg = new \Swoole\Coroutine\WaitGroup(); $count = 10; if ($i<10) { $count = $i; } $i -= 10; for (; $count>=1; $count--) { $wg->add(); Swoole\Coroutine::create(function()use ($wg){ $response = $this->request->request(); if ($response->isSuccess()) { $this->addResponseTime($response->getResponseTime()); } $wg->done(); }); } $wg->wait(); } $endTime = microtime(true); echo '总共耗时:'.ceil(($endTime - $startTime)*1000).'ms'.PHP_EOL; }); }}$request = new GetRequest('https://www.baidu.com');$pressureTest = new PressureTest($request);$pressureTest->run(10, 100);echo "并发数: 10".PHP_EOL;echo "请求数: 100".PHP_EOL;echo "平均响应时间: ".$pressureTest->getAvgResponseTime().'ms'.PHP_EOL;echo "95%响应时间: ".$pressureTest->getPercentageResponseTime().'ms'.PHP_EOL;
总共耗时:3255ms
并发数: 10
请求数: 100
平均响应时间: 245.33ms
95%响应时间: 341ms
划线
评论
复制
发布于: 2020 年 07 月 21 日阅读数: 64
孙志平
关注
还未添加个人签名 2018.05.08 加入
还未添加个人简介
评论