sendbuffertoworker fail. may be the send buffer are overflow
说明
出现这个错误说明服务端处理请求的速度低于客户端发送请求的速度。 例如服务端处理一个请求需要 10 毫秒,那么单个进程每秒最多处理 100 个请求,如果客户端每秒发来 200 个请求,
那么就有 100 个请求排队等待处理。如果是一直处于这种状态,则会有越来越多的请求积压在请求队列,导致请求被延迟处理,
最终导致积压数据大小超过队列缓冲区上限 (上限受 $Gateway->sendToWorkerBufferSize 控制),然后报出这个错误。
可以调大 businessWoreker 进程数缓解问题,但是想根本解决问题需要从以下途径解决:
运行 php start.php status 命令检查是否有 busy 的进程。
出现 busy 进程则可能是以下原因:
1、业务代码有死循环。表现为对应进程占用 cpu 率很高,对应进程一直是 busy 状态
2、业务代码可能阻塞在某个外部资源请求上。表现为对应进程占用 cpu 使用率很低,对应进程一直是 busy 状态
3、业务执行比较慢,表现为 busy 的进程过一会儿恢复成 idle 状态
4、有大量的请求需要进程处理,表现为对应进程 cpu 很高
如果 busy 进程对应的 cpu 占用很高,需要 review 代码看看哪里有 while (1) foreach for 类似的代码。
如果 cpu 不高,需要用 strace -ttp $pid 命令跟踪下进程系统调用,
是否有 read (fd=x、 poll (fd=x 类似的代码,如果有说明进程在等待某个 fd 的数据返回,
这时用 lsof -p $pid | grep $fd 查看进程在等待哪个外部资源的返回,从而定位是哪里问题。
如果是业务比较慢,则需要打日志定位下业务哪个部分比较耗时,然后做响应优化。
如果是有大量的请求需要处理,可以考虑降低请求量或者增加 businessWorker 进程数量或者增加服务器分布式部署。