swoole进程模型记录

swoole进程模型记录

master进程 manager进程 worker进程*worker_num/task进程*worker_num
所以最少有三个进程

master进程 fork(master)
master线程
reactor对象*worker_num(Epoll/kqueue)
reactor线程*worker_num
处理tcp连接,收发数据,处理网络IO,处理协议
完成异步非阻塞模式
Swoole的主线程在Accept新的连接后,会将这个连接分配给一个固定的Reactor线程,并由这个线程负责监听此socket。在socket可读时读取数据,并进行协议解析,将请求投递到Worker进程。在socket可写时将数据发送给TCP客户端。
reactor线程和worker进程:通信使用unixsocket
底层:在master线程,reactor线程和worker进程间使用unixsocket通信

心跳检测线程
UDP收包线程

manager进程
创建worker/task
回收worker/task
管理worker/task

worker*worker_num进程/task*worker_num进程 fork(master)
worker
onFunction
onFunction
….
task

运行模式
多进程模式 swoole_process [默认]
连接和请求发送分离
woker进程发生致命错误时,连接不会被切断
问题
存在2次IPC开销,master和woker进程通过unix socket通信
woker和master通信
master收到数据后会投递【dispatch】给woker
dispatch模式
轮询模式
轮询发送给每个worker
fd模式
fd%woker_num 保证一个tcp客户端连接到同一个worker进程
如果客户端用了连接池,就不推荐使用了。
忙闲模式
reactor只会给空闲的worker进程投递数据。
问题是客户端的woker是随机的,不确定那个worker处理请求。无法保存连接状态。
ip取模
ip分配到同一个worker进程
uid取模
需要bind设置uid,逻辑同ip取模
stream模式
类似php-fpm unix socket方式通信,worker进程会变成leader-follower模式

通信过程
使用unix socker dgram通信 数据包方式
使用动态缓存区,一次性发送一个大包(512kb-4mb),取决于net.core.wmem_max。减少内存copy。降低系统调用次数。

基本模式 swoole_base
异步非阻塞模型
循环调用回到函数,如果函数阻塞,退化为同步模式。
base下没有master进程角色
每个woker进程同时承担了process模式下reactor线程和woker线程职责

socket类型:
TCP UDP TCP6 UDP6 UnixSocket[Stream/Dgram]

发表评论