配置说明$server->set(array('daemonize'=>true,'log_file'=>'/www/log/swoole.log','reactor_num'=>2,'worker_num'=>2,'task_worker_num'=>4,'max_request'=>100,));daemonize设置是否在后台运行。默认为假。当设置daemonize=>1时,程序将进入后台并作为守护进程运行。长时间运行的服务器端程序必须启用此选项。如果没有启用守护进程,当ssh终端退出时,程序将被终止。注意:启用守护程序时,标准输入和输出将重定向到log_file。如果未设置log_file,它将被重定向到/dev/null并且所有打印的屏幕消息都将被丢弃。log_file指定swoole错误日志文件。swoole运行时发生的异常信息都会记录在这个文件中。默认情况下,它会打印到屏幕上。注意log_file不会自动拆分文件,所以这个文件需要定期清理。通过重新打开日志,可以按天记录日志。log_level设置swoole_server错误日志打印的级别,范围0-5。不会抛出低于log_level设置的日志消息。默认值为0,表示打印所有级别。0=>DEBUG1=>TRACE2=>INFO3=>NOTICE4=>WARNING5=>ERRORreactor_num反应器线程数,使用该参数调整主进程中的事件处理线程数,以充分利用多核。默认情况下,将启用相同数量的CPU内核。reactor_num一般设置为CPU核数的1-4倍,swoole中reactor_num最大不要超过CPU核数*4。Swoole的主进程是一个多线程程序。有一组非常重要的线程,称为Reactor线程。它是真正处理TCP连接和发送和接收数据的线程。Reactor线程分析协议并将请求传递给Worker进程。推荐配置:CPU核心数。注意:reactor_num必须小于或等于worker_num。如果设置的reactor_num大于worker_num,那么swoole会自动调整让reactor_num等于worker_num。worker_num设置启动的工作进程数。worker_num>=1,至少会有一个,默认1个。设置方式:业务代码完全异步非阻塞。设置为CPU的1-4倍是最合理的。业务代码同步阻塞,需要根据请求响应时间和系统负载进行调整。比如一个请求耗时100ms,要提供1000QPS的处理能力,需要配置100个以上的进程。但是需要考虑内存使用情况。假设每个进程占用40M内存,那么100个进程需要占用4G内存。推荐配置:CPU核心数*2。task_worker_num配置任务进程数。配置该参数后,将启用任务功能。如果业务不使用异步任务,则无需设置。一旦设置了辅助参数,就必须设置onTask/onFinish2事件回调。注意:任务进程中不能使用swoole_server->task方法。任务进程中不能使用mysql-async/redis-async/swoole_event等异步IO函数。推荐配置:根据实际异步任务占比设置。dispatch_mode包分发策略。可以选择3种类型,默认为2种。一般情况下,HttpServer可以使用1、3;WebSocketServer可以使用默认的2.1,round-robin模式,会轮流分配给每个worker进程。2.fixed模式下,worker是根据连接的文件描述符来分配的。这确保了同一连接发送的数据只会由同一工作人员处理。3、在抢占模式下,主进程会根据worker忙闲状态来选择投递,只会投递给空闲状态的worker。4.IP分配,根据客户端IP取模hash,分配给固定的worker进程。可以保证来自同一个源IP的连接数据总是分配给同一个worker进程。该算法是ip2long(ClientIP)%worker_num。5.UID分配需要在用户代码中调用$serv->bind()绑定一个连接到1个uid。然后swoole根据UID的值分配给不同的worker进程。算法是UID%worker_num,如果需要使用字符串作为UID,可以使用crc32(UID_STRING)。dispatch_mode配置在BASE模式下无效,因为BASE没有派发任务。max_request设置worker进程的最大任务数,默认为0。该参数主要作用是解决PHP进程的内存溢出问题。一个worker进程在处理超过max_request值的任务后会自动退出,进程退出后会释放所有内存和资源。比如设置为3,假设有2个worker进程,执行了5个请求,一个worker进程退出,重新启动一个新的worker进程。如果未设置,则不会执行此操作。PHP应用缓慢内存泄漏,但无法定位具体原因,无法解决。可以通过设置max_request来解决。如果代码没有内存泄漏的问题,每次访问内存都不会增加一点,那么不设置(默认为0)就不会发生内存泄漏。反之,max_request可以限制内存的无限增长,从而防止内存泄漏。(参考http://group.swoole.com/quest...task_max_request类似于max_request,默认5000,用于设置任务进程的最大任务数,一个任务进程结束后会自动退出处理超过这个值的任务。这个参数是为了防止PHP进程内存溢出。如果不想让进程自动退出,可以设置为0。max_conn(max_connection)服务器程序,允许的最大连接数,比如max_conn=>10000,这个参数用来设置Server最大允许维护多少个tcp连接,超过这个数量后,新的传入连接将被拒绝,默认值为ulimit-n的值。系统的ulimit-n可能太小,需要手动设置,比如ulimit-n65535,最大不能超过运行系统ulimit-n的值,否则会报警告信息,重新设置为该值ulimit-n的。不要调整st这个参数太大了,根据机器内存的实际情况设置。heartbeat_idle_time、heartbeat_check_interval和heartbeat_check_interval一起使用。连接允许的最大空闲时间。如:array('heartbeat_idle_time'=>600,//表示连接的最大允许空闲时间'heartbeat_check_interval'=>60,//表示每隔几秒循环一次);表示每60秒遍历一次,一个连接如果600秒内没有数据发送到服务器,连接将被强行关闭。开启heartbeat_idle_time后,服务器不会主动向客户端发送数据包,而是被动等待客户端发送心跳。如果只设置heartbeat_idle_time,不设置heartbeat_check_interval,底层不会创建心跳检测线程,可以在PHP代码中调用heartbeat方法手动处理连接超时。open_eof_check,package_eof设置EOF字符串。package_eof只允许传入最多8个字节的字符串array('open_eof_check'=>true,//开启EOF检测'package_eof'=>"\r\n",//设置EOF)开启EOF检测,该选项会检测客户端连接发送的数据,当数据包以指定字符串结尾时才会传递给Worker进程。否则会一直拼接数据包,直到超出缓存区或超时终止。当出现错误时,swoole底层会认为是恶意连接,丢弃数据并强行关闭连接。常见的协议如Memcache/SMTP/POP都是以rn结尾的,所以可以使用这个配置。启用后,可以保证Worker进程每次总是收到一个或多个完整的数据包。open_eof_splitEOF检测不会从数据中间找到eof字符串,所以Worker进程可能同时收到多个数据包,需要在应用层代码中explode("\r\n",$data)拆分数据包。1.7.15版本增加了open_eof_split,支持从数据中找到EOF并拆分数据。pid_file在服务器启动时自动将master进程的PID写入文件,在服务器关闭时自动删除PID文件。(1.9.5+支持)$server->set(array('pid_file'=>__DIR__.'/server.pid',));其他参数参见:配置选项-Swoole-Swoole文档中心https://wiki.swoole.com/wiki/...服务器调优常用优化参数:#kerneloptimizationulimit-n65535net.core.somaxconn=262144net。ipv4.tcp_tw_recycle=1net.ipv4.tcp_tw_reuse=1net.ipv4.tcp_syncookies=1#nginx优化worker_rlimit_nofile65535;useepoll;worker_connections65535;keepalive_timeout60;如何修改内核优化:1、ulimit参数可以直接运行ulimit-SHn65535,可以用ulimit-n查看;2.其他参数优化示例:net.core.somaxconn对应文件/proc/sys/net/core/somaxconn:#查看cat/proc/sys/net/core/somaxconn#修改echo65535>/proc/sys/net/core/somaxconnnet.ipv4.tcp_tw_recycle对应文件/proc/sys/net/ipv4/tcp_tw_recycle:#查看cat/proc/sys/net/ipv4/tcp_tw_recycle#修改echo65535>/proc/sys/net/ipv4/tcp_tw_recycle3,也可以修改/etc/sysctl.conf文件:#调用HighsystemIPandportdatalimit,从中可以接受更多的连接将被内核丢弃net.ipv4.tcp_max_syn_backlog=3240000#增加socket监听阈值net.core.somaxconn=3240000net.ipv4.tcp_max_tw_buckets=1440000#调大TCP存储大小net.core.rmem_default=8388608net.core.rmem_max=16777216net.core.wmem_max=16777216net.ipv4.tcp_rmem=40968738016777216net.ipv4.tcp_wmem=40966553616777216net.ipv4.tcp_congestion_control=cubic#tcprecyclenet.ipv4.tcp_tw_recycle=1net.ipv4.tcp_tw_reuse=1修改配置后需要执行如下命令使其生效:sysctl-p/etc/sysctl.conf相关应用1、https://github.com/matyhtf/fr...2.衍生开源项目-Swoole-Swoole文档中心https://wiki.swoole.com/wiki/...3.moell-peng/webim:PHP+Swoole实现的简单聊天室https://github.com/moell-peng...参考1、Server-Swoole-Swoole文档中心https://wiki.swoole.com/wiki/...2、swoole_study/Swoole进程模型.mdatmasterszyhf/swoole_studyhttps://github.com/szyhf/swoo...
