异常退出exit with status 9

defeatlr

测试客户端用的workerman

    // 当前链接每1秒发个心跳包
    Timer::add(1, function () use ($con) {
        $data = 'send 8000,86358603733073,0003,AA00000000,0003,00,0818031611,,,,0000'. "\r\n";
        for ($i=0;$i<100;$i++){
            $data .= 'send 8000,86358603733073,0003,AA00000000,0003,00,0818031611,,,,0000'. "\r\n";
        }
        $con->send($data);
    });
    $con->connect();
    echo $count, "connections complete\n";

开了100个连接,GW运行几分钟报错

exit with status 9 
Warning: stream_socket_client(): unable to connect to tcp://127.0.0.1:12345 (Cannot assign requested address)

如果连接数在开多点,Gateway也会无法连接,错误信息

Exception: can not connect to tcp://127.0.0.1:2901 Connection refused in GatewayWorker/vendor/workerman/gateway-worker/src/Lib/Gateway.php:725

请问这个错误是不是
maxSendBufferSize 是发送缓冲区的大小,当服务端发送速度大于客户端接收速度时,数据会挤压在发送缓冲区,如果发送缓冲区满,则触发onBufferFull事件回调,在这个事件回调中做处理(例如停止向客户端继续发送数据)。

如果onMesage不能及时处理数据,数据会首先数据会积压在客户端socket发送缓冲区(操作系统提供,大小约几十K)和workerman服务器的socket接受缓冲区(操作系统提供,大小约几十K),如果客户端socket发送缓冲区满,则客户端调用socket写操作将阻塞(block模式)或者立刻返回失败(非阻塞模式),当服务端onMessage处理完毕再次读取本地socket接收缓冲区数据后,客户端socket发送缓冲区的数据会继续发送过来到服务端socket接收缓冲区,然后依次循环。

所以当服务端onMessage不能及时处理数据,不会导致maxSendBufferSize满,但是可能会导致数据在客户端和服务端的socket缓冲区积压。
引起的?
要怎么解决?

6651 6 0
6个回答

walkor

Cannot assign requested address 是因为不断的创建连接把本地socket端口用光了。
参考workerman手册优化下linux内核。
另外注意不要无限创建socket连接又不关闭,会导致本地端口资源迅速耗费光。

  • 暂无评论
defeatlr

嗯内核我参照手册做过优化的,估计是我调用异步任务的时候不关闭连接引起的

        $task_connection = new AsyncTcpConnection('Text://127.0.0.1:12345');
        $task_connection->send($message);
        $task_connection->onMessage = function ($task_connection, $task_result) use ($client_id) {
            if ($task_result == 'ok') {
               // $task_connection->close();
                Gateway::sendToClient($client_id, 1);
            }
        };
        $task_connection->connect();

因为我在测试的时候发现这里连接关闭以后,好像客户端会自动断开连接,我服务端开了30S的心跳检测
关闭异步连接,客户端就正常不会断开 我也不知道哪里出问题了
另外我想问下 就是我客户端发送的数据量 就比如上面这个字符串的大小 会有什么影响吗?

  • 暂无评论
walkor

对框架没什么影响

  • 暂无评论
defeatlr

测试的时候我如果数据量小没问题,如果和上面一样200条一起发,运行一会有些客户端连接会被强制关闭,看了下服务器负载是已经超了很多了,是不是负载的原因引起连接被关闭呢

  • 暂无评论
walkor

有可能

  • 暂无评论
defeatlr

嗯,明天改分布式在跑下看看,多谢

  • 暂无评论
年代过于久远,无法发表回答
🔝