当前位置: 首页 > 后端技术 > PHP

压测swoole_websocket_server性能

时间:2023-03-30 03:42:24 PHP

概述这是Swoole入门学习的第十篇:压测swoole_websocket_server性能。Part9:SwooleRedis连接池的实现Part8:SwooleMySQL的实现Part7:SwooleRPC的实现Part6:Swoole集成到一个小框架Part5:Swoole多协议和多端口的应用Part4:应用SwooleHTTPPart3:SwooleWebSocket的应用Part2:SwooleTask的应用Part1:SwooleTimer的应用压力测试QPS,我还没找到办法...》swoole_http_server压力测试,我们可以使用Apache的ab命令。swoole_websocket_server的压测,ab命令不能压测,我从网上也没有找到合适的方法,看官方代码benchmark/async.php,压测使用的异步模块swoole\http\client方法test可以,但是swoole4.3版本去掉了异步模块,允许使用Coroutine协程模块,本地我是用Coroutine实现的,测试的时候差不多,不知道是不是r它是正确的,所以我发送了一个关于segmentfault的问题。没想到韩老师回答了,老师也回答了'ifif',非常感谢两位老师的回答,然后把文章整理出来分享给大家。测试机上安装的ParallelsDesktop虚拟机系统Mac:Ubuntu16.04.3LTS内存:数量:1核心数:2CPU:数量:1大小:2GServerCodeserv=newSwoole\WebSocket\Server("0.0.0.0",9501);$this->serv->set(['task_worker_num'=>10,'enable_coroutine'=>true,'task_enable_coroutine'=>true]);$this->serv->on('open',function($serv,$request){});$this->serv->on('message',function($serv,$frame){$serv->task($frame->data);});$this->serv->on('task',function($serv,$task){foreach($serv->connectionsas$fd){$connectionInfo=$serv->connection_info($fd);if(isset($connectionInfo['websocket_status'])&&intval($connectionInfo['websocket_status'])==3){$serv->push($fd,$task->da塔);}}});$this->serv->on('finish',function($serv,$task_id,$data){});$this->serv->on('close',function($serv,$fd){});$this->serv->start();}}$server=newServer();压测脚本classTest{protected$concurrency;//并发量protected$request;//请求量protected$requested=0;受保护的$start_time;函数__construct(){$this->concurrency=100;$this->请求=10000;}protectedfunctionwebSocket(){go(function(){for($c=1;$c<=$this->concurrency;$c++){$cli=new\Swoole\Coroutine\Http\Client('127.0.0.1',9501);$cli->set(['websocket_mask'=>false]);$ret=$cli->upgrade('/');if($ret){$i=$this->request/$this->concurrency;while($i>=1){$this->push($cli);$cli->recv();$我--;}}}$this->finish();});}protectedfunctionpush($cli){$ret=$cli->push('HelloWorld');如果($ret===true){$this->requested++;}}protectedfunctionfinish(){$cost_time=round(microtime(true)-$this->start_time,4);echo"并发:".$this->concurrency.PHP_EOL;echo"Requestnum:".$this->request.PHP_EOL;echo"成功次数:".$this->requested.PHP_EOL;echo"总时间:".$cost_time.PHP_EOL;echo"每秒请求数:".intval($this->request/$cost_time).PHP_EOL;}publicfunctionrun(){$this->start_time=microtime(true);$this->webSocket();}}$test=newTest();$test->run();压力测试结果第1次:Concurrency:100Requestnum:10000Successnum:10000总时间:0.846每秒请求数:11820第二次:并发数:100请求数:10000成功数:10000总时间:0.9097每秒请求数:10992第三次:并发数:100请求数:10000per1time30SuccessTotal.9秒:以上11074,为压测结果以供参考。总结通过这个压测结果,说明Swoole的执行效率是非常优秀的!当然,还有一些参数是可以调优的,比如:worker_num、max_request、task_worker_num等。在实际业务场景中,肯定会有逻辑处理,MySQL和Redis也会用到。那么问题来了,前两篇已经分享过,SwooleRedis连接池,SwooleMySQL连接池,有兴趣的同学,可以使用上面的两个连接池,然后进行压测。不知不觉已经写了10篇Swoole入门文章了。非常感谢您的支持。真心希望能帮助到正在入门Swoole的同学。推荐阅读:系统详解-SSO单点登录系统详解-PHPWEB安全防御系统详解-PHP缓存技术系统详解-PHP接口签名验证系统详解-PHP浮点数高精度计算欢迎转发本文,转发请注明作者和出处,谢谢!一起学习