资讯专栏INFORMATION COLUMN

压测 swoole_websocket_server 性能

余学文 / 1791人阅读

摘要:概述这是关于入门学习的第十篇文章压测性能。测试机上安装的虚拟机系统内存数量核数数量大小代码压测脚本并发量请求量压测结果第次第次第次以上是压测结果,供参考。小结通过这个压测结果,表明的执行效率是杠杠的当然还有一些参数是可以调优的,比如等。

概述

这是关于 Swoole 入门学习的第十篇文章:压测 swoole_websocket_server 性能。

第九篇:Swoole Redis 连接池的实现

第八篇:Swoole MySQL 的实现

第七篇:Swoole RPC 的实现

第六篇:Swoole 整合成一个小框架

第五篇:Swoole 多协议 多端口 的应用

第四篇:Swoole HTTP 的应用

第三篇:Swoole WebSocket 的应用

第二篇:Swoole Task 的应用

第一篇:Swoole Timer 的应用

收到读者提问 “使用 Swoole 开发的群聊功能,想知道并发情况,也就是想压测下 QPS,一直未找到方法 ...”

对 swoole_http_server 压测,咱们可以使用 Apache 的 ab 命令。

对 swoole_websocket_server 压测,使用 ab 命令是不能压测的,我从网上一直也没找到合适的方法,看官方提供的代码 benchmark/async.php 中,使用的异步模块 swoolehttpclient 方法进行压测的,但在 Swoole 4.3 版本就移除了异步模块,让使用 Coroutine 协程模块。

在本地我用 Coroutine 协程实现了一下, 测的差不多的时候,一直不确定是否正确,就在 segmentfault 发了个提问,没想到韩老师回答了,"如果的如果"老师也回答了,非常感谢两位老师的答案,然后整理出文章分享给大家。

测试机

Mac 上安装的 Parallels Desktop 虚拟机

系统:Ubuntu 16.04.3 LTS

内存:

数量:1

核数:2

CPU:

数量:1

大小:2G

Server 代码
serv = new SwooleWebSocketServer("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->connections as $fd) {
                $connectionInfo = $serv->connection_info($fd);
                if (isset($connectionInfo["websocket_status"]) && intval($connectionInfo["websocket_status"]) == 3) {
                    $serv->push($fd, $task->data);
                }
            }
        });
        $this->serv->on("finish", function ($serv, $task_id, $data) {});
        $this->serv->on("close", function ($serv, $fd) {});
        $this->serv->start();
    }
}

$server = new Server();
压测脚本
class Test
{
    protected $concurrency; //并发量
    protected $request;     //请求量
    protected $requested = 0;
    protected $start_time;

    function __construct()
    {
        $this->concurrency = 100;
        $this->request     = 10000;
    }

    protected function webSocket()
    {
        go(function () {
            for ($c = 1; $c <= $this->concurrency; $c++ ) {
                $cli = new SwooleCoroutineHttpClient("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();
                        $i--;
                    }
                }
            }
            $this->finish();
        });
    }

    protected function push($cli)
    {
        $ret = $cli->push("Hello World");
        if ($ret === true) {
            $this->requested ++ ;
        }
    }

    protected function finish()
    {
        $cost_time = round(microtime(true) - $this->start_time, 4);
        echo "Concurrency:".$this->concurrency.PHP_EOL;
        echo "Request num:".$this->request.PHP_EOL;
        echo "Success num:".$this->requested.PHP_EOL;
        echo "Total time:".$cost_time.PHP_EOL;
        echo "Request per second:" . intval($this->request / $cost_time).PHP_EOL;
    }

    public function run()
    {
        $this->start_time = microtime(true);
        $this->webSocket();
    }
}

$test = new Test();
$test->run();
压测结果
第 1 次:
Concurrency:100
Request num:10000
Success num:10000
Total time:0.846
Request per second:11820

第 2 次:
Concurrency:100
Request num:10000
Success num:10000
Total time:0.9097
Request per second:10992

第 3 次:
Concurrency:100
Request num:10000
Success num:10000
Total time:0.903
Request per second:11074

以上是压测结果,供参考。

小结

通过这个压测结果,表明 Swoole 的执行效率是杠杠的!

当然还有一些参数是可以调优的,比如:worker_num、max_request、task_worker_num 等。

在真实的业务场景中,肯定会有逻辑处理,也会使用到 MySQL、Redis。

那么问题来了,前两篇文章已经分享了,Swoole Redis 连接池、Swoole MySQL 连接池,感兴趣的同学,可以使用上两种连接池,然后再进行压测。

不知不觉,Swoole 入门文章已经写了 10 篇了,非常感谢大家的捧场,真心希望能够对 Swoole 入门学习的同学,有点帮助。

推荐阅读

系统的讲解 - SSO 单点登录

系统的讲解 - PHP WEB 安全防御

系统的讲解 - PHP 缓存技术

系统的讲解 - PHP 接口签名验证

系统的讲解 - PHP 浮点数高精度运算

本文欢迎转发,转发请注明作者和出处,谢谢!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31666.html

相关文章

  • 实战 swoole【聊天室】

    摘要:是一个请求对象,包含了客户端发来的握手请求信息事件函数中可以调用向客户端发送数据或者调用关闭连接事件回调是可选的当服务器收到来自客户端的数据帧时会回调此函数。 前言:了解概念之后就应该练练手啦,不然就是巨婴 有收获的话请加颗小星星,没有收获的话可以 反对 没有帮助 举报三连 代码仓库 实战swoole【聊天室】 在线体验 准备工作 需要先看初识swoole【上】,了解基本的服务端...

    andycall 评论0 收藏0
  • 基于 Swoole 的微信扫码登录

    摘要:随着微信的普及,扫码登录方式越来越被现在的应用所使用。这里基于微信公众平台的带参数临时二维码,并且结合的服务实现扫码登录。对于用户扫临时的二维码,微信会触发相应的回调事件,我们需要在该回调事件中处理用户的扫码行为。 随着微信的普及,扫码登录方式越来越被现在的应用所使用。它因为不用去记住密码,只要有微信号即可方便快捷登录。微信的开放平台原生就有支持扫码登录的功能,不过大部分人还是在用公众...

    Half 评论0 收藏0
  • 全链路压测一招搞定,阿里云性能测试铂金版发布

    摘要:摘要阿里云性能测试是卓越的性能测试平台,具备强大的分布式压测能力,可模拟海量用户的真实业务场景,让所有性能问题无所遁形。近日,宣布推出了基于阿里双全链路压测平台的铂金版。 摘要: 阿里云性能测试(Performance Testing Service)是卓越的SaaS性能测试平台,具备强大的分布式压测能力,可模拟海量用户的真实业务场景,让所有性能问题无所遁形。近日,PTS宣布推出了基于...

    zhaochunqi 评论0 收藏0
  • 全链路压测一招搞定,阿里云性能测试铂金版发布

    摘要:摘要阿里云性能测试是卓越的性能测试平台,具备强大的分布式压测能力,可模拟海量用户的真实业务场景,让所有性能问题无所遁形。近日,宣布推出了基于阿里双全链路压测平台的铂金版。 摘要: 阿里云性能测试(Performance Testing Service)是卓越的SaaS性能测试平台,具备强大的分布式压测能力,可模拟海量用户的真实业务场景,让所有性能问题无所遁形。近日,PTS宣布推出了基于...

    gotham 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<