写点什么

性能测试 - 第七周作业

用户头像
孙志平
关注
发布于: 2020 年 07 月 21 日

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

并发数<=系统最佳性能并发数

系统的响应时间:无明显变化

吞吐量:直线上升

系统最佳性能并发数<并发数<=系统承受的最大并发数

系统的响应时间:明显变大

吞吐量:达到顶峰

并发数>系统承受的最大并发数

系统的响应时间:取向无穷大

吞吐量:取向0



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



该工具包含了 请求类、压力测试类,具体的关系如下图。



<?php
interface 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



用户头像

孙志平

关注

还未添加个人签名 2018.05.08 加入

还未添加个人简介

评论

发布
暂无评论
性能测试 - 第七周作业