异常退出exit with status 9

0

测试客户端用的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缓冲区积压。
引起的?
要怎么解决?

已邀请:

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

赞同来自:

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

要回复问题请先登录注册