Swoole 中关于 swoole_websocket_server 压测的问题。

Swoole 版本:4.3

对 swoole_websocket_server 压测时,使用这个方法可行吗?

//代码片段

$this->concurrency = 100;
$this->request     = 100000;

go(function () {
    for ($c = $this->concurrency; $c--;) {
        $cli = new \Swoole\Coroutine\Http\Client('127.0.0.1', 9501);
        $ret = $cli->upgrade('/');
        if ($ret) {
            while ($this->requested < $this->request) {
                $this->push($cli);
                $cli->recv();
            }
        }
    }
});

官方使用的 swoole_http_client 在 4.3 版本移除了。

另外:

使用 Task 或 不使用 Task,压测时会有很大区别吗,目前本地测着区别不大,是这样的吗?

//使用 Task 代码
$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);
        }
    }
});
//未使用Task代码
$this->serv->on('message', function ($server, $frame) {
    foreach ($this->serv->connections as $fd) {
        $connectionInfo = $this->serv->connection_info($fd);
        if (isset($connectionInfo['websocket_status']) && intval($connectionInfo['websocket_status']) == 3) {
            $server->push($fd, $frame->data);
        }
    }
});

机器信息

Mac 上安装的 Parallels Desktop 虚拟机

系统:Ubuntu 16.04.3 LTS

内存:

  • 数量:1
  • 核数:2

CPU:

  • 数量:1
  • 大小:2G

Concurrency:100
Request num:100000
Success num:100000
Total time:8.9364
Request per second:11190

请前辈们指点,这个量级有问题吗?

感谢!

阅读 2.3k
2 个回答

对,使用协程 和 协程 websocket 客户端进行压测。性能可以进行优化,建议关闭 websocket_mask ,这个比较耗费 CPU

你的机器本身只有 1 核,还要同时运行客户端和服务器端,1万 QPS 已经非常好了。

首先,你这个压测脚本是有问题的,可以大体修改为如下:

$c = 100;
$all = 1000;
for (; $c >= 0;$c--) {
    go(function ()use($c,$all){
        $cli = new \Swoole\Coroutine\Http\Client('127.0.0.1', 9501);
        $ret = $cli->upgrade('/');
        if ($ret) {
            $i = $all/$c;
            while ($i>= 1) {
                $this->push($cli);
                $cli->recv();
                $i--;
            }
        }
    });
}

另外,这个数量级是没有问题的,你要知道,实际上我们普通的小系统中的数据库,是远远达不到这个承载力的,也就是说,实际上你应该关注的点是在数据库优化上,而不是swoole的执行效率。如果你真的想提高效率,去写websocket应用,你可以用easyswoole框架,里面提供了各种连接池,还有https://github.com/easy-swool...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进