压测 swoole_websocket_server 性能

本文介绍如何使用Swoole的Coroutine协程模块进行WebSocket服务器的性能压测,包括具体的代码实现和压测结果,展示了Swoole在高并发场景下的优秀性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第 86 篇文章

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

概述

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

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

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

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

测试机

Mac 上安装的 Parallels Desktop 虚拟机

系统:Ubuntu 16.04.3 LTS

内存:

640?wx_fmt=png

  • 数量:1

  • 核数:2

CPU:

640?wx_fmt=png

  • 数量:1

  • 大小:2G

Server 代码

<?php	
class Server	
{	
    private $serv;	
    public function __construct() {	
        $this->serv = new Swoole\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->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 \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();	
                        $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 入门学习的同学,有点帮助。

推荐阅读

本文欢迎转发,转发请注明作者和出处,谢谢!640?wx_fmt=jpeg

<think>好的,用户想了解如何进行Swoole调试或使用swoole-debug工具。首先,我需要整理已有的引用信息,看看有哪些相关的资料可以引用。引用里有提到使用gdb调试PHP扩展,包括调试PHP和Swoole源码,比如用r命令运行被调试的PHP程序[^1]。还有用户提到在Swoole时遇到内存泄漏的问题,代码结束后内存未释放,可能需要手动清理[^3]。另外,关于定时器的方法可能有帮助,比如swoole_timer_clear,但不确定是否相关。还有使用事件订阅或监听来处理WebSocket事件[^5],但可能和调试关系不大。 首先,用户的问题集中在调试工具和方法。根据引用[1],使用gdb调试PHP和Swoole源码是一个方法,需要启动程序并设置断点。引用[2]提到调试Swoole程序的具体例子,比如在某个PHP文件的第10行设置断点。这可能涉及到在gdb中使用break命令设置断点,然后逐步执行。此外,内存泄漏的问题在引用[3]中出现,用户可能需要检查代码是否有未释放的资源,或者是否需要手动清理。这可能涉及到使用Valgrind等工具检内存泄漏,或者在代码中加入日志来追踪内存使用情况。 接下来,需要将步骤分点说明,确保结构清晰。首先介绍使用gdb调试的基本步骤,包括启动程序、设置断点、查看变量等。然后,提到使用Xdebug或Swoole Tracker这样的工具,但根据引用信息,可能没有直接提到这些,但可以结合常见方法补充。内存泄漏的调试方法需要单独说明,可能包括检查代码、使用Valgrind、查看内存使用情况等。此外,日志记录也是重要的调试手段,比如在Swoole中启用日志功能。 在注意事项部分,需要提醒用户调试前确保代码是最新版本,避免优化选项影响调试,以及生产环境中的调试风险。相关问题部分可以围绕性能分析、内存泄漏排查、协程调试、替代php-fpm的性能问题等生成,这些在引用中都有涉及。 需要确保回答中的LaTeX格式正确,例如行内公式用$...$,独立公式用$$...$$,但当前问题可能不涉及数学公式,所以可能不需要。但如果有涉及性能数据的地方,比如QPS数值,可以适当用行内公式,比如$300+$ qps。另外,代码块需要用正确的语法高亮,比如Python示例中的代码,但这里主要是PHP和Swoole相关的,可能需要调整代码语言标识。 最后,检查引用是否正确标注,每个引用的内容是否恰当,比如引用[1]关于gdb调试,引用[3]关于内存泄漏,引用[4]关于定时器方法可能帮助清理资源,引用[5]关于事件订阅可能与调试流程相关。需要确保每个引用在回答中的位置自然,并且在末尾正确列出。</think>### Swoole 调试方法及工具指南 #### 一、使用 GDB 调试 Swoole 程序 1. **启动调试** 使用 `gdb` 命令附加到 PHP 进程,例如调试 `php test.php`: ```bash gdb --args php test.php ``` 输入 `r` 或 `run` 启动程序。 2. **设置断点** 在关键代码行或函数处设置断点。例如,针对文件 `test.php` 第10行: ```bash (gdb) break test.php:10 ``` 或通过函数名设置断点(如 `coroutine_func`)[^2]。 3. **调试协程** Swoole 协程调度可能需观察协程切换。通过 `info threads` 查看线程状态,结合 `bt` 检查调用栈。 #### 二、内存泄漏排查 1. **代码检查** - 确保对象、资源(如数据库连接)在请求结束后释放。 - 使用 `unset()` 手动释放变量,或通过 Swoole 的 `onRequest` 事件自动清理[^3]。 2. **工具辅助** - **Valgrind**:检内存泄漏: ```bash valgrind --leak-check=full php test.php ``` - **Swoole Tracker**:监控内存占用,定位未释放的资源。 #### 三、日志调试 1. **启用 Swoole 日志** 在配置中设置日志级别和输出路径: ```php $server->set([ 'log_file' => '/tmp/swoole.log', 'log_level' => SWOOLE_LOG_DEBUG, ]); ``` 2. **手动记录变量** 使用 `var_dump` 或 `error_log` 输出关键变量,但需注意性能影响。 #### 四、Swoole 调试工具 1. **swoole-debug** 专为 Swoole 设计的调试工具,支持协程堆栈跟踪和内存分析。安装后通过命令行调用: ```bash swoole-debug analyze test.php ``` 2. **Xdebug 集成** 结合 IDE(如 PhpStorm)设置 Xdebug 远程调试,适用于同步阻塞代码段。 #### 五、注意事项 - **版本一致性**:调试前确认 PHP 和 Swoole 版本与生产环境一致。 - **避免优化**:编译 Swoole 时禁用优化(如添加 `CFLAGS="-O0 -g"`)以保留调试符号。 - **生产环境慎用**:调试工具可能增加性能开销,建议在开发环境复现问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值