压测 swoole_websocket_server 性能
概述
这是关于 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
中,使用的异步模块 swoole\http\client
方法进行压测的,但在 Swoole 4.3 版本就移除了异步模块,让使用 Coroutine
协程模块。
在本地我用 Coroutine
协程实现了一下, 测的差不多的时候,一直不确定是否正确,就在 segmentfault 发了个提问,没想到韩老师回答了,'如果的如果'老师也回答了,非常感谢两位老师的答案,然后整理出文章分享给大家。
测试机
Mac 上安装的 Parallels Desktop 虚拟机
系统:Ubuntu 16.04.3 LTS
内存:
- 数量:1
- 核数:2
CPU:
- 数量: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 入门学习的同学,有点帮助。
本文欢迎转发,转发请注明作者和出处,谢谢!
压测 swoole_websocket_server 性能的更多相关文章
- ESRally压测ElasticSearch性能 CentOS 7.5 安装 Python3.7
1,CentOS 7.5 安装 Python3.7 1.安装开发者工具 yum -y groupinstall "Development Tools"2.安装Python编译依赖包 ...
- 实战jmeter入门压测接口性能
什么是Jmeter? 是Apache组织开发的基于Java的压力测试工具. 准备工作: 一.安装配置好环境及压测工具 Jmeter下载地址:http://mirrors.tuna.tsinghua.e ...
- JMeter接口压测和性能监测
JMeter接口压力测试总结 一.安装JMeter 1. 在客户端机器上安装JMeter压测工具,我这里安装的版本是apache-jmeter-5.2.1,由于JMeter是JAVA语言开发的 ...
- RocketMQ这样做,压测后性能提高30%
从官方这边获悉,RocketMQ在4.9.1版本中对消息发送进行了大量的优化,性能提升十分显著,接下来请跟着我一起来欣赏大神们的杰作. 根据RocketMQ4.9.1的更新日志,我们从中提取到关于消息 ...
- super-smack压测工具
简介 super-smack是一款开源压测工具,支持MySQL.PostgreSQL.Oracle.本篇主要介绍一下使用super-smack压测MySQL体会. 1.SQL定义 2.数据字典定义 3 ...
- HAProxy压测及参数调优
背景 小米容器云平台,在构建云厂商集群时,需要通过HAProxy将云厂商LB流量从宿主机转到容器中,但对于HAProxy的性能没有把握.参考网上的一篇HAProxy压测文章,文章中提到HAProxy ...
- Linux服务器压测/拷机软件收集
最近公司采购了一批服务器,于是收集了一些拷机软件来压测服务器硬件性能.硬件的稳定相对来说比较重要,7x24小时无间断运行,主要看三个硬件:CPU.内存.硬盘. 下面是收集的一些教程,可能网址已经失效了 ...
- jmeter压测、操作数据库、分布式、 linux下运行的简单介绍
一.jmeter压测 1.如何压测 常规性能压测:10-15分钟 稳定性测试:一周.2天等 如果想要压测10分钟,勾选永远,勾选调度器,填写600秒.也可以使用固定启动时间. 2.tps.响应时间 ( ...
- 让全链路压测变得更简单!Takin2.0重磅来袭!
自Takin社区版1.0发布两个多月以来,有很多测试同学陆续在各自的工作中运用了起来,其中包括金融.电商.物流.出行服务等行业.这个过程中我们收到了很多同学的反馈建议,同时也了解到很多同学在落地全链路 ...
随机推荐
- Kubernetes 集群升级docker版本
Kubernetes 集群升级docker版本 原则:升级完一台正常后再接着升下一台. Work Node 一.迁移上的pod(保证业务,但期间会出现抖动) kubectl drain $NODE ...
- Microsemi Libero使用技巧——使用命令行模式下载程序
前言 在工程代码编译完成之后,如果需要给某个芯片下载程序时,或者是工厂量产烧录程序时,我们不需要把整个工程文件给别人,而只需要把生成的下载文件给别人,然后使用FlashPro就可以单独下载程序文件了. ...
- 魔术师发牌问题 -- python实现
问题描述 魔术师手中有A.2.3--J.Q.K十三张黑桃扑克牌.在表演魔术前,魔术师已经将他们按照一定的顺序叠放好(有花色的一面朝下).魔术表演过程为:一开始,魔术师数1,然后把最上面的那张牌翻过来, ...
- 1.Python 简单输入输出
1 读取:input() 1.1 简单打印内容 In [1]: input('你好,请输入你的名字:') 你好,请输入你的名字:小明 1.2 保存输入内容 In [2]: CN_Name = inpu ...
- VMware_Player_nat网络的端口映射_手工设置
VMware_Player_nat网络的端口映射_手工设置 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-12-21. vmware nat的配置文件在 C:\ProgramDat ...
- 【zabbix服务】修改zabbix_server默认端口号
1. zabbix-server的默认端口号是10051.如果存在端口号冲突,需要更改端口号. 2. 更改配置文件 # 监听端口这行默认被注释的(将下面的端口改为自己定义的) [root@tanbao ...
- Centos 下安装 Nginx(新)
今天重新实践了下 CentOS 7.6 下安装 Nginx,总结了一条更直接并简单的方式 从官方获取写入 nginx.repo 的方式 从官网查看文档,获取 nginx.repo 的文档内容,将其内容 ...
- R的获取和安装
一.下载 R可以在CRAN(Comprehensive r archive network)http://cran.r-project.org上免费下载,可供选择的有Linux.Mac OS X和wi ...
- PHP服务化搭建之nginx动静分离实战
如有什么问题可以加群交流:647617935 什么是动静分离 动静分离:将项目中的CSS,JS,HTML,JPG'.等静态资源和 PHP等动态资源分开处理的一种方式 动静分离优点 不同的文件由不同类型 ...
- odoo开发安装插件教程小技巧
安装Odoo插件时而可能很繁琐且易于出现未知错误.当Odoo出现错误提示时.您需要深层次查询内核模块,安装其它依赖插件,下载全部插件,将它们放到恰当的部位,点安装,随后处理错误,然后再次测试,直至凡事 ...