物联网业务单纯测试 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扩展。