物联网业务单纯测试 TCP 连接数量已经没用意义,所以需要做压力测试的时候模拟真实业务,比如有5万台设备,每分钟内都上传一次 GPS 数据等。这时候测试的不再是 workerman 框架自身的性能,而是 Server 端整体的性能。
昨天开始尝试用 workerman 作为 TCP Client 与 server 对接(server 端也是 wokerman-gatewway),通信协议是基于 TCP 的自定义协议,下面是示例代码:
<?php
use Protocols\LindeProtocol;
use Workerman\Lib\Timer;
use \Workerman\Worker;
use \Workerman\Connection\AsyncTcpConnection;
require_once __DIR__ . '/Autoloader.php';
$deviceMaxNumber = 10;
for ($i = 0; $i < $deviceMaxNumber; $i++) {
$task = new Worker();
$deviceId = "99999888887777$i";
$task->onWorkerStart = function ($task) use ($deviceId) {
require_once __DIR__ . '/SmartLinkBusinessWorker.php';
$busWorker = new \Workerman\SmartLinkBusinessWorker($deviceId);
$time_interval = 1;
Timer::add($time_interval,
function () use ($busWorker) {
$busWorker->timerTick();
}
);
$connection = new AsyncTcpConnection('lindeProtocol://_._._._:*);
// 当连接建立成功时
$connection->onConnect = ;
$connection->onMessage = ;
$connection->onClose = ;
$connection->onError = ;
$connection->onWorkerStop = ;
$connection->connect();
};
}
// 运行worker
Worker::runAll();
目前是模拟10个客户端没有问题,如果想模拟一万个客户端,能否继续使用上面的方法(只把 deviceMaxNumber 从10改成10000)?
或者能否指点一下更优的方案?
http://wenda.workerman.net/?/question/1453
直接new 多个 AasyncTcpConnection,类似这样估计可行。
个人认为作者这个方案不是很好,因为 deviceMaxNumber 的数量直接决定了启动的子进程数量,而且每个子进程只维持了一个AsyncTcpConnection连接,随着deviceMaxNumber 数量的增加,进程启动开销随之增加,其实可以将进程分组,每组进程内维持N个链接,类似负载均衡效果。
大家试过workerman/gateway-worker 做为 server 端,能保持多少 TCP 链接吗?
我的情况:
服务器:
Centos 6.8
4核心
16G 内存
已经完全按照 Linux 内核调优参数章节进行了调优
但成功建立 TCP 链接始终不超过两千,达到一千多以后,AsyncTcpConnection的 onError 函数频繁被触发:
Error code:1 msg:connect 115.159.77.248:20073 fail after 127.281 seconds
现在是开启50个进程,每个进程维护100个连接。
这是 “
/etc/sysctl.conf
” 配置客户端连接失败时,workerman/gateway-worker 端没有触发任何错误信息,看起来状态良好
客户端维持每10秒发送一次心跳,烦请大家帮忙看看
客户端所在服务器也要按照workerman手册调优内核,安装event扩展。