资讯专栏INFORMATION COLUMN

Swoole笔记(五)

zgbgx / 1053人阅读

摘要:超过此数量后,新进入的连接将被拒绝。表示连接最大允许空闲的时间。当出错时底层会认为是恶意连接,丢弃数据并强制关闭连接。在启动时自动将进程的写入到文件,在关闭时自动删除文件。

配置说明
$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

设置是否后台运行。默认是false。设置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 =>DEBUG
1 =>TRACE
2 =>INFO
3 =>NOTICE
4 =>WARNING
5 =>ERROR
reactor_num

reactor线程数,通过此参数来调节主进程内事件处理线程的数量,以充分利用多核。默认会启用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进程数。worker_num >= 1,至少会有一个,默认是 1。设置方法:

业务代码是全异步非阻塞的,这里设置为CPU的1-4倍最合理。

业务代码为同步阻塞,需要根据请求响应时间和系统负载来调整。

比如1个请求耗时100ms,要提供1000QPS的处理能力,那必须配置100个进程或更多。但是需要考虑内存占用。假设每个进程占用40M内存,那100个进程就需要占用4G内存。

推荐配置:CPU核数*2。

task_worker_num

配置task进程的数量,配置此参数后将会启用task功能。如果业务用不到异步任务,可以不设置。一旦设置次参数,必须设置onTask/onFinish2个事件回调。

注意:

task进程内不能使用swoole_server->task方法

task进程内不能使用mysql-async/redis-async/swoole_event等异步IO函数

推荐配置:根据实际异步任务比重设置。

dispatch_mode

数据包分发策略。可以选择3种类型,默认为2。一般情况下,HttpServer可以使用1、3;WebSocketServer可以使用默认的2。

1,轮循模式,收到会轮循分配给每一个worker进程。

2,固定模式,根据连接的文件描述符分配worker。这样可以保证同一个连接发来的数据只会被同一个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进程会退出并被重新拉起一个新的。如果不设置,就不会执行这个操作。

PHP应用程序有缓慢的内存泄漏,但无法定位到具体原因、无法解决,可以通过设置max_request解决。

如果代码没有内存泄露的问题,没有每访问一次,内存就增加一点,那不设置(默认为0)也不会有内存泄露。反之,max_request,就可以限制内存无限制增长,从而防止内存泄露。(参考http://group.swoole.com/quest...

task_max_request

类似于max_request,默认为5000。用于设置task进程的最大任务数。一个task进程在处理完超过此数值的任务后将自动退出。这个参数是为了防止PHP进程内存溢出。如果不希望进程自动退出可以设置为0。

max_conn (max_connection)

服务器程序,最大允许的连接数,如max_conn => 10000, 此参数用来设置Server最大允许维持多少个tcp连接。超过此数量后,新进入的连接将被拒绝。

默认值为ulimit -n的值。系统的ulimit -n可能太小,需要手动设置。例如ulimit -n 65535

最大不得超过操作系统ulimit -n的值,否则会报一条警告信息,并重置为ulimit -n的值。

此参数不要调整的过大,根据机器内存的实际情况来设置。

heartbeat_idle_time、heartbeat_check_interval

heartbeat_idle_time与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" => "
", //设置EOF
)

打开EOF检测,此选项将检测客户端连接发来的数据,当数据包结尾是指定的字符串时才会投递给Worker进程。否则会一直拼接数据包,直到超过缓存区或者超时才会中止。当出错时swoole底层会认为是恶意连接,丢弃数据并强制关闭连接。

常见的Memcache/SMTP/POP等协议都是以rn结束的,就可以使用此配置。开启后可以保证Worker进程一次性总是收到一个或者多个完整的数据包。

open_eof_split

EOF检测不会从数据中间查找eof字符串,所以Worker进程可能会同时收到多个数据包,需要在应用层代码中自行explode(" ", $data) 来拆分数据包。

1.7.15版本增加了open_eof_split,支持从数据中查找EOF,并切分数据。

pid_file

在Server启动时自动将master进程的PID写入到文件,在Server关闭时自动删除PID文件。(1.9.5+支持)

$server->set(array(
    "pid_file" => __DIR__."/server.pid",
));

其它参数详见:配置选项-Swoole-Swoole文档中心
https://wiki.swoole.com/wiki/...

服务器调优

常见优化参数:

# 内核优化
ulimit -n 65535
net.core.somaxconn = 262144
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1

# nginx优化
worker_rlimit_nofile 65535;
use epoll;
worker_connections 65535;
keepalive_timeout 60;

内核优化如何修改:
1、ulimit参数直接运行ulimit -SHn 65535即可,可以使用ulimit -n查看;
2、其它参数优化示例:
net.core.somaxconn对应文件/proc/sys/net/core/somaxconn:

# 查看
cat /proc/sys/net/core/somaxconn

# 修改
echo 65535 > /proc/sys/net/core/somaxconn

net.ipv4.tcp_tw_recycle对应文件/proc/sys/net/ipv4/tcp_tw_recycle:

# 查看
cat /proc/sys/net/ipv4/tcp_tw_recycle

# 修改
echo 65535 > /proc/sys/net/ipv4/tcp_tw_recycle

3、也可以修改/etc/sysctl.conf文件:

# 调高系统的 IP 以及端口数据限制,从可以接受更多的连接
net.ipv4.ip_local_port_range = 2000 65000
 
net.ipv4.tcp_window_scaling = 1
 
# 设置协议栈可以缓存的报文数阀值,超过阀值的报文将被内核丢弃
net.ipv4.tcp_max_syn_backlog = 3240000
 
# 调高 socket 侦听数阀值
net.core.somaxconn = 3240000
net.ipv4.tcp_max_tw_buckets = 1440000
 
# 调大 TCP 存储大小
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_congestion_control = cubic

# tcp重新回收
net.ipv4.tcp_tw_recycle = 1
net.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的进程模型.md at master · szyhf/swoole_study
https://github.com/szyhf/swoo...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25684.html

相关文章

  • PHP多进程系列笔记

    摘要:消息队列更常见的用途是主进程分配任务,子进程消费执行。子进程前面加了个,这是为了防止父进程还未往消息队列中加入内容直接退出。 前面几节都是讲解pcntl扩展实现的多进程程序。本节给大家介绍swoole扩展的swoole_process模块。 swoole多进程 swoole_process 是swoole提供的进程管理模块,用来替代PHP的pcntl扩展。 首先,确保安装的swoole...

    qianfeng 评论0 收藏0
  • swoole 学习笔记swoole 真的优秀一个框架

    摘要:所以,我感觉学习,需要一个引导。学习参考链接喵星球特别厉害的一个官网的几个框架文档优势先看一下的结构设计的应用场景的设计项目中引入一个简易的具体参考一篇文章,集合和的简易实例项目中引入结合致敬 前期学完了操作系统,特别是知道了进程,线程 调度的问题。回来看,发现了很多细节。第三次看文档,最初经一个高手朋友的介绍,看swoole,说文档写的贼好。但是看的时候,也是很一头雾水,只知道把de...

    13651657101 评论0 收藏0
  • Swoole笔记(一)

    摘要:修复添加超过万个以上定时器时发生崩溃的问题增加模块,下高性能序列化库修复监听端口设置无效的问题等。线程来处理网络事件轮询,读取数据。当的三次握手成功了以后,由这个线程将连接成功的消息告诉进程,再由进程转交给进程。此时进程触发事件。 本文示例代码详见:https://github.com/52fhy/swoo...。 简介 Swoole是一个PHP扩展,提供了PHP语言的异步多线程服务器...

    SHERlocked93 评论0 收藏0
  • swoole 学习笔记

    摘要:安装准备或更高版本或更高版本安装扩展配置支持编辑在其中加入扩展支持服务端代码服务端客户端代码测试代码在命令模式下输入重新再开一个窗口可以用检测如服务端客户端如上,表示服务端启动,客户端连接服务端返回消息,一个闭环形成开发者头条 1.安装准备 php-5.3.10 // 或更高版本 gcc-4.4 //或更高版本 make autoconf 2.安装swoole扩展 w...

    justCoding 评论0 收藏0
  • Swoole笔记(二)

    摘要:配置了参数后将会启用功能,务必要注册个事件回调函数。周期性定时器一次性定时器清除定时器定时器回调函数注意最大不得超过。进程中不能添加定时器。建议在回调里写定时器。定时器示例防止重复每隔触发一次后执行此函数 本文示例代码详见:https://github.com/52fhy/swoo...。 重新打开日志 在1.8.11及之后版本支持重新打开日志:向Server主进程发送SIGRTMIN...

    jsummer 评论0 收藏0

发表评论

0条评论

zgbgx

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<