求大神帮忙:workman 进程busy并自动重启

leroy06

服务经常就出现busy状态  使用strace查看提示如下信息

18:15:07.511241 write(1, " >>Send dat"..., 125) = -1 EAGAIN (Resource temporarily unavailable)
18:15:07.511263 select(2, [], , [], {60, 0}) = ? ERESTARTNOHAND (To be restarted if no handler)

由于状态已进入busy就自动重新了 无法使用lsof追踪问题。
 
请问这个busy问题是如何引起的,因为现在还是内测阶段,负载非常小,几乎不存在任何高并发的情况。并且socket传输的信息只作为前端交互信息使用,并没有复杂的后端业务。
 
 

4472 2 0
2个回答

blogdaren

1、write(...)  -1 EAGAIN (Resource temporarily unavailable) 代表内核发送缓冲区写满了,装不下了,所以喊进程不断的重试,你业务是否有死循环或报异常? 对端接收数据正常?  php start.php status 观察下是否有异常?
2、参考官方解决方案: http://doc.workerman.net/debug/busy-process.html

  • 暂无评论
leroy06

感谢~ 业务并没有死循环也没有异常 就是消息发送过快时候就会出现这个问题 
执行php start.php status 显示如附件
尝试参考官方解决方案,但是由于进程一但进入busy状态,进程就会自动杀死并重开一个进程,无法通过lsof的方式查看到底问题出现在哪里。请问内核发送缓冲区是否可以设置大一些来解决这个问题吗

  • blogdaren 2018-11-21

    1、内核的发送缓冲区是可以修改的【直接修改linux内核相关参数或者用socket_set_option函数操作,具体参考手册】,但是这个是治标不治本。
    2、你这个是由于发送消息过快,对端接收的慢,导致发送端缓冲区写满,建议你设置onBufferFull、onBufferDrain回调来控制流量频率。
    3、至于你说的进程自动重启,这个不知道你怎么测的,不觉明历。

年代过于久远,无法发表回答
🔝