workerman模型中,如果由于worker进程数设置不够,可能会导致新来的请求无法及时处理吗?会发生什么情况?(不讨论AsyncTcpConnection那种方案)主要是想了解会有queue吗?这部分是wm处理还是系统处理?因为有时候worker可能只是某一时会不够,大多数时没问题,设置太大不好。
workerman模型中,如果由于worker进程数设置不够,可能会导致新来的请求无法及时处理吗?
会。
会发生什么情况?
会出现响应延迟。
主要是想了解会有queue吗?
系统为每个socket连接分配了一个socket读缓冲区(默认8k),用来缓冲客户端发来的请求数据。worker空闲时会从这个缓冲区读出请求数据,然后处理这个请求,处理完毕后如果缓冲区还有数据,则继续处理,是一个循环。所以这个socket读缓冲区其实可以看做一个queue,用来缓冲请求。如果这个缓冲满了,则系统内核将停止接收这个客户端发来的后续数据,直到读缓冲区有数据被worker取走。
同样客户端也有一个发送缓冲区(默认8k,也可以看做一个queue),用来缓冲发送的请求数据,当服务端的socket读缓冲区满时,客户端仍然不停的向服务端发送数据,客户端的socket发送缓冲区也会被填满。这时分两种情况: 1、如果客户端是阻塞发送,则会一直卡在发送接口,直到服务端socket读缓冲区可写或者超时(会有一个错误码)。 2、如果是非阻塞发送,发送接口会立刻返回一个错误码,错误码类似当前数据不可写,稍后重试
这部分是wm处理还是系统处理?
socket缓冲由系统处理,workerman从这个缓冲读请求数据。
因为有时候worker可能只是某一时会不够,大多数时没问题,设置太大不好。
不够一般是由于业务阻塞太多,处理一个请求或者某类比较耗时,应该增加worker进程。比如cpu核数的8倍甚至更大。太大可能会增加进程切换开销,但是如果不够,则无法充分利用系统资源,尤其是cpu资源,导致业务延迟。
great!!! 群主回答得太详细了,耽误群主这么多时间,让我都有些不好意思了。
会。
会出现响应延迟。
系统为每个socket连接分配了一个socket读缓冲区(默认8k),用来缓冲客户端发来的请求数据。worker空闲时会从这个缓冲区读出请求数据,然后处理这个请求,处理完毕后如果缓冲区还有数据,则继续处理,是一个循环。所以这个socket读缓冲区其实可以看做一个queue,用来缓冲请求。如果这个缓冲满了,则系统内核将停止接收这个客户端发来的后续数据,直到读缓冲区有数据被worker取走。
同样客户端也有一个发送缓冲区(默认8k,也可以看做一个queue),用来缓冲发送的请求数据,当服务端的socket读缓冲区满时,客户端仍然不停的向服务端发送数据,客户端的socket发送缓冲区也会被填满。这时分两种情况:
1、如果客户端是阻塞发送,则会一直卡在发送接口,直到服务端socket读缓冲区可写或者超时(会有一个错误码)。
2、如果是非阻塞发送,发送接口会立刻返回一个错误码,错误码类似当前数据不可写,稍后重试
socket缓冲由系统处理,workerman从这个缓冲读请求数据。
不够一般是由于业务阻塞太多,处理一个请求或者某类比较耗时,应该增加worker进程。比如cpu核数的8倍甚至更大。太大可能会增加进程切换开销,但是如果不够,则无法充分利用系统资源,尤其是cpu资源,导致业务延迟。
great!!!
群主回答得太详细了,耽误群主这么多时间,让我都有些不好意思了。