测试客户端用的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缓冲区积压。
引起的?
要怎么解决?
Cannot assign requested address 是因为不断的创建连接把本地socket端口用光了。
参考workerman手册优化下linux内核。
另外注意不要无限创建socket连接又不关闭,会导致本地端口资源迅速耗费光。
嗯内核我参照手册做过优化的,估计是我调用异步任务的时候不关闭连接引起的
因为我在测试的时候发现这里连接关闭以后,好像客户端会自动断开连接,我服务端开了30S的心跳检测
关闭异步连接,客户端就正常不会断开 我也不知道哪里出问题了
另外我想问下 就是我客户端发送的数据量 就比如上面这个字符串的大小 会有什么影响吗?
对框架没什么影响
测试的时候我如果数据量小没问题,如果和上面一样200条一起发,运行一会有些客户端连接会被强制关闭,看了下服务器负载是已经超了很多了,是不是负载的原因引起连接被关闭呢
有可能
嗯,明天改分布式在跑下看看,多谢