public function delay(float $delay, callable $func, array $args = []): int
{
file_put_contents('/tmp/timer.log', (new \Exception('delay')) . "\n", FILE_APPEND);
public function repeat(float $interval, callable $func, array $args = []): int
{
file_put_contents('/tmp/timer.log', (new \Exception('repeat')) . "\n", FILE_APPEND);
我的配置是pingInterval=14, pingNotResponseLimit=1,客户端每6s会有一个心跳,现在的问题是,每过一段时间,有时候24小时,有时候12小时,gateway status 就会显示有超过实际连接几倍的连接数,而且本来每个进程只有3个timer的会变成有几百个timer,
查看连接情况
netstat -nt | grep 39002 | grep ESTABLISHED
能看到操作系统39002连接情况。
php start.php connections
能看到workerman统计的连接情况。
为什么会有定时器
使用一些功能或者组件会启动定时器,例如使用了AsyncTcpConnection,设置了reconnect()定时重连,连接断开后会产生一个定时器,连接成功后删除定时器。使用了一些组件或功能可能会产生定时器。
给定时器记录日志
如果你要记录哪里使用了定时器,需要自己记录日志,
例如 vendor/workerman/workerman/src/Events/Swoole.php 里的
websocket业务注意事项
websocket业务,应该在服务端设置一个定时器,定时清理不活跃连接,例如定时关闭60秒不活跃的连接。
前端需要保证至少每隔59秒通讯一次保持连接。
如果没有这个机制,会导致服务端会积累一些无效的连接无法及时清理,例如手机用户关闭了网络、关机、网络切换、进入无信号区域等,这种极端断网情况服务端操作系统是无法及时感知的,需要定时通讯感知。
高负载
如果两个服务器的代码和用户量一样,那么服务器一本身有点问题,它的负载比服务器2高很多。
需要用top等命令找出哪些进程占用cpu高,是否是workerman进程。
如果是workerman进程可以用
strace -ttp pid
命令查看进程在执行哪些系统调用,导致cpu很高。找不同
如果你确认两个服务器用户量一样,代码运行环境都一样,那么服务器一负载比服务器二高就一定还是有不同。
你需要找到不同的地方,例如服务器一多运行了一些服务如mysql等。
例如服务器一带宽遇到瓶颈,服务器内核没有优化等原因。
websocket业务注意事项这里,我使用的是gateway是不是就不需要用定时任务去关闭不活跃连接了,在gate进程中有个心跳判断并关闭的
这个不一定,看配置,按照gateway手册推荐配置去做可以自动踢掉不活跃连接
我的配置是pingInterval=14, pingNotResponseLimit=1,客户端每6s会有一个心跳,现在的问题是,每过一段时间,有时候24小时,有时候12小时,gateway status 就会显示有超过实际连接几倍的连接数,而且本来每个进程只有3个timer的会变成有几百个timer,
没什么思路,查看busy进程,也没看到卡在哪来,就是不断处理各种问题,fd也一直在变,没有卡在那个fd
原因无法从截图或者描述中猜到。
如果你是gatewayWorker,不要开swoole,gatewayWorker不支持协程。
后面就关了swoole了,如果是busineesWorker进程一直在不断重启,是什么原因啊? 重启一次起一个timers?
重启会有日志