gateway worker 出现状态wait和busy繁忙状态

romy

我查询start的运行状态的时候,发现有几个bussiness worker的request是busy状态,netstat查看的时候有很多是ESTABLISHED。请问这个多进程是怎么控制和处理的啊

5030 17 0
17个回答

romy

有时候出现,我的gateway worker是保持连接的状态,但是就是收不到客户端发送的消息,必须重新start.php restart

  • 暂无评论
walkor

status 里出现 busy 说明业务代码哪里长时间阻塞了,需要用 strace 配合 lsof定位下阻塞在哪里

  • 暂无评论
romy

好的,我试一下,另外还有一个问题,就是gateway worker中的初始化,比如数据库连接,redis连接,要怎么做不会每次都初始化呢。是在onWorkerStart中操作么。比如我的onMessage方法中,会调用数据库查询,就会Db::instance('dbConfig')->row($sql);这样每次消息通讯,是不是都是在连接数据库,消耗大量性能呢?能不能给个具体的onWorkerStart中初始化的事例

  • 暂无评论
walkor

参考手册的做法就行了

  • 暂无评论
romy

手册哪儿有啊,手册里就只有一个输出语句

  • 暂无评论
walkor

手册有搜索功能,搜mysql回车就出来了

http://doc2.workerman.net/326155

  • linggang668 2017-11-30

    我现在也遇到这个问题了,process status中为busy,在文档中没找到怎么处理,请大神指点一下

romy

好的,谢谢哈

  • 暂无评论
walkor

linux系统下
命令行运行

strace -ttp busy的进程pid

能看到阻塞在哪个fd上,假设fd=13

然后利用命令

lsof -nPp busy的进程pid

能看到fd=13的资源是什么,就知道阻塞在哪里了

  • 暂无评论
romy

ok,我一会儿试一下,非常感谢

  • 暂无评论
romy

还有一个问题,关于reload重启后,我Events中引入的外部文件修改没有生效,只有的情况要怎么处理啊,reload后我的我其他自己创建的外部文件里修改的能自己更新生效呢。

  • 暂无评论
walkor

不要在Worker::runAll()前载入那些文件就行。

  • 暂无评论
romy

放在Worker::runAll()后面的话,手册上不说说不往后面继续执行了么

  • 暂无评论
walkor

额,刚说的不够准确。
应该是不要在Worker::runAll()运行前载入那些文件就行。

比如在onXXX里载入的文件都是可以reload载入的

  • 暂无评论
romy

好的,我都移入到onWorkStart里了,谢谢你一直在解答我的问题,非常感谢

  • 暂无评论
romy

还有一种情形,就是我做了restart操作后,服务器是断开后重新启动的,那么客户端会有中断的情形,然后客户端重连发消息,服务器端就一直收不到消息。不知道服务器端重连后怎么再次能接收到客户端的消息呢

  • 暂无评论
romy

另外的一个郁闷的问题就是,status里send_fail原因,这个要怎么很好的解决啊

  • walkor 2018-02-06

    有send fail正常,具体看workerman手册常见问题

later

谢谢,学了一招

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