reactor_num
reactor_num
表示Reactor线程数量,主要用于调节Master主进程内事件处理线程的数量,以充分利用多核优势,默认使用CPU核数。reactor_num
一般设置为CPU核数的1到4倍,在Swoole中reactor_num
最大不得超过CPU核数的4倍。
Reactor线程可利用多核,如果机器有128个核Swoole会启动128个线程,每个线程都会维持一个EventLoop
,另外线程之间是无锁的。由于指令可以被128核CPU并行执行,考虑到操作系统调度存在一定程序的偏差,可以设置为CPU核数的2倍,以便最大化利用CPU的每个核。
worker_num
worker_num
表示启动Worker进程的数量,当业务代码是全异步非阻塞时设置为CPU的1到4倍最为合理,当业务代码为同步阻塞时则需要根据请求响应时间和系统负载来调整。
假如一个请求耗时100毫秒,如果要提供1000QPS的处理能力,那就需要配置1000QPS*100ms/1000 = 100
个进程或更多。当开启的Worker进程越多时就占用的内存会大大增加,而且进程之间切换的开销会越来越大。假如每个进程占用40M内存,那100个进程就会占用大约40G的内存,所以根据实际情况适当即可。
task_worker_num
- Task任务进程是同步阻塞的,配置方式与Worker同步模式一致。
- Task任务进程内不能使用
swoole_server->task()
方法 - Task任务进程内不能使用
mysql-async
、redis-async
、swoole_event
等异步IO函数。
task_worker_num
用于配置Task任务进程的数量,配置后Swoole将会启用Task功能,所以swoole_server
务必要注册onTask
和onFinish
两个事件回调函数。如果没有注册的话,服务器程序将会无法启动。
task_ipc_mode
task_ipc_mode
用于设置Task任务进程与Worker进程之间的通信方式,其选项包括:
- 1 表示使用
unix socket
通信 - 2 表示使用消息队列通信
- 3 表示使用消息队列通信并设置为争抢模式,此时
task
或taskwait
将无法指定目标进程IO。
task_max_request
task_max_request
用于设置Task任务进程的最大任务数量,一个Task任务进程在处理超过task_max_request
的任务后会自动退出。
task_max_request
是为了防止PHP进程内存溢出,如果不希望进程自动退出可设置为0。
task_max_request
默认值为5000,受到swoole_config.h
中的SW_MAX_REQUEST
宏控制。
Swoole1.7.17+版本默认值调整为了0,不会主动退出进程。
task_tmpdir
task_tmpdir
用于设置Task进程的数据临时目录,适用于Swoole1.7.7+版本,在swoole_server
中如果投递的数据超过了8192字节时,将会启动临时文件来保存数据,此时task_tmpdir
是用来设置临时文件保存的位置。
max_request
max_request
表示设置Worker进程的最大任务数量,当一个Worker进程在处理超过max_request
的任务后会自动退出,因此max_request
是为了防止PHP进程的内存溢出。如果不希望进程自动退出可设置max_request
为0。当Worker进程内发生致命错误或人工执行exit
退出时,进程会自动退出。与此同时,Master主进程会重启一个新的Worker进程来出合理任务。
max_conn
max_conn
表示服务器程序最大允许的连接数量,max_conn
用于设置服务器最大允许维持多少个TCP连接。当服务器超过max_conn
时,后续新进的连接将会被拒绝。
max_conn
最大不得超过操作系统ulimit -m
的值,若超过Swoole会报出一条警告信息,并自动重置为ulimit -m
的值。
WARN swServer_start_check: serv->max_conn is exceed the maximum value[10000].
max_conn
应根据机器内存的实际情况来设置,不要设置的过大。Swoole会根据max_conn
一次性分配一块内存来保存Connection
连接信息。
dispatch_mode
dispatch_mode
用于设置数据包的分发策略,可选三种类型,默认为2。
- 1 表示轮询模式,收到会轮询分配给每个Worker进程。
- 2 表示固定模式,根据连接的文件描述符分配Worker进程,这样可以保证同一个连接发来的数据只会被同一个Worker处理。
- 3 表示抢占模式,Master主进程会根据Worker工作进程的蛮闲状态选择投递,只会投递给处于闲置状态的Worker。
- 4 表示IP分配,根据TCP/UDP连接的来源IP进行取模hash,分配给一个固定的Worker进程,可以保证同一个来源IP的连接数据总会被分配到同一个Worker进程。
- 5 表示UID分配,需要用户代码中调用
$server->bind()
将一个连接绑定到一个UID,然后Swoole会根据UID的值分配到不同的Worker工作进程。
dispatch_mode
中4和5两种模式在Swoole1.7.8+版本适用
dispath_mode
中1和3,底层会屏蔽onConnect
和onClose
事件,原因是在这两种模式下无法保证onConnect
、onClose
、onReceive
的顺序。非请求响应式的服务器程序中不要使用模式1或3。
在SWOOLE_BASE
单线程模式下,dispatch_mode
配置是无效的,因为单线程中不存在投递任务。
当Reactor线程收到客户端发送过来的数据后会理解回调onReceive
函数,不需要投递Worker进程。
daemonize
daemonize
用于设置守护进程,当设置daemonize
为1时程序将转入后台作为守护进程运行,长时间运行的服务器程序必须启用此项。如果不启动守护进程,当SSH终端退出后程序将被终止运行。
- 启用守护进程后标准输入和输出将被终止运行
- 如果未设置
log_file
将重定向到/dev/null
,所有打印屏幕的信息都会被丢弃。 - 启用守护进程后,当前目录环境变量的值会发生变更,相对路径的文件读写会出错,PHP程序中必须使用绝对路径。