【Swoole 的生命周期,文件描述符,协程数量,以及默认值】

目录

[Swoole 的生命周期](#Swoole 的生命周期)

[Swoole 文件描述符(FD)缓存](#Swoole 文件描述符(FD)缓存)

Swoole设置协程的数量

[Swoole 默认值](#Swoole 默认值)


Swoole 是一个基于 PHP 的高性能网络通信引擎,它采用 C++ 编写,提供了协程和高性能的网络编程支持。Swoole 支持多种网络服务器和客户端模块,能够轻松快速地实现 TCP/UDP 服务、高性能 Web、WebSocket 服务、IoT、实时通信、游戏和微服务等,打破了 PHP 在传统 Web 领域的限制1。

Swoole 的生命周期

主要分为以下几个阶段:

  1. 初始化(PHP_MINIT_FUNCTION):当 PHP 启动时,会调用 Swoole 的初始化函数,用于设置全局状态和定义常量等3。

  2. 请求开始(PHP_RINIT_FUNCTION):每个 PHP 请求开始时,Swoole 会进行请求相关的初始化工作,如设置请求状态、注册关闭函数等3。

  3. 请求处理:在请求处理阶段,Swoole 可以利用其协程特性,以同步的方式编写异步代码,提高性能2。

  4. 请求结束(PHP_RSHUTDOWN_FUNCTION):请求结束时,Swoole 会进行资源的清理和释放,包括事件循环资源、服务器资源和协程资源等3。

  5. 关闭(PHP_MSHUTDOWN_FUNCTION):当 PHP 关闭时,Swoole 会执行清理工作,释放运行过程中的资源,避免资源泄露3。

  6. 信息(PHP_MINFO_FUNCTION):Swoole 还提供了一个函数用于打印关于模块的信息,如作者、版本等3。

Swoole 的设计目标是为了解决传统 PHP-FPM 模式并发慢的问题,通过常驻内存和协程机制来提高 PHP 应用的性能。它允许开发者以同步的方式编写代码,而 Swoole 在底层自动处理异步逻辑,降低了编程的复杂性2。

此外,Swoole 的事件循环和协程上下文切换都是内存读取,避免了 CPU 寄存器、堆栈以及系统内核态与用户态之间的切换,因此切换开销极小3。这使得 Swoole 在处理大量并发连接时表现出色,同时保持了较低的资源消耗。

Swoole 文件描述符(FD)缓存

默认的 100000 不是单个 worker 进程下的协程数目。实际上,这个数字是指 Swoole 服务器的文件描述符(FD)缓存大小,默认情况下,Swoole 会为每个 worker 进程分配一个大小为 100MB 的缓冲区来缓存数据。

在 Swoole 中,协程(Coroutine)是一种轻量级的线程,用于处理 I/O 密集型任务,而不会阻塞整个进程。协程的默认数量取决于你的 Swoole 服务器配置。Swoole 允许你配置每个 worker 进程的协程数量,这个数量可以根据你的应用需求和服务器性能进行调整。

PHP 开发者通常可以启动多个 worker 进程来提高并发处理能力。Swoole 通过 master-worker 模式来管理这些进程,其中:

  • master 进程:负责接收客户端连接,并将连接分发给 worker 进程。
  • worker 进程:实际处理业务逻辑,可以包含多个协程来并行处理 I/O 操作。

每个 worker 进程的协程数量可以在 Swoole 服务器的配置中设置,例如使用 Swoole\Serverset 方法:

php 复制代码
$server->set([
    'worker_num' => 4, // 设置 worker 进程的数量
    'max_coroutine' => 10000, // 设置每个 worker 进程的协程数量
]);

在这个例子中,worker_num 表示 worker 进程的数量,而 max_coroutine 表示每个 worker 进程可以创建的协程的最大数量。根据你的应用场景和服务器资源,你可以调整这些值以获得最佳性能。

Swoole 的默认值为 100000,指的文件描述符缓存大小,而不是协程数量。

Swoole设置协程的数量

应该查看 Swoole 的配置项 max_coroutine

max_coroutine 是 Swoole 协程模式下每个 worker 进程中可以创建的最大协程数量。这个值可以根据应用需求和服务器性能进行调整。协程数量的设置没有固定的范围,但通常受限于以下几个因素:

  1. 服务器内存:每个协程都需要分配一定的内存空间来存储其执行状态,包括局部变量、寄存器状态等。因此,服务器的可用内存是限制协程数量的一个重要因素。

  2. 操作系统限制:操作系统可能对单个进程可以打开的文件描述符数量有限制,这间接影响了协程的数量,因为每个协程都可能涉及到文件描述符的操作。

  3. Swoole 配置:Swoole 允许你通过配置来设置协程的数量,但这个设置需要在合理的范围内,以避免因为协程过多导致的性能问题。

  4. 应用场景:I/O 密集型的应用可能需要更多的协程来充分利用 I/O 等待时间,而 CPU 密集型的应用则可能需要较少的协程,以避免过多的上下文切换和资源竞争。

  5. 性能测试:最佳的协程数量往往需要通过性能测试来确定,这涉及到对应用进行压力测试,找到最优的配置点。

通常,Swoole 的 max_coroutine 默认值可能在几千到几万之间,但具体的最佳值需要根据应用和服务器环境来确定。如果应用主要是 I/O 密集型,并且服务器有充足的内存资源,可以尝试增加协程的数量。但是,如果协程数量过多,可能会导致内存使用过高,或者因为频繁的上下文切换而降低性能。

在设置 max_coroutine 时,你也应该考虑设置 worker_num,即 worker 进程的数量。Swoole 的 worker 进程数量通常设置为 CPU 核心数的 1-4 倍,这样可以充分利用多核 CPU 的计算能力,同时避免进程之间的上下文切换开销。

最后,调整这些参数的最佳方法是进行实际的性能测试,根据测试结果来找到最适合应用的配置。

Swoole 默认值

php 复制代码
hyperf官方文档有这么一段话

最大协程数限制
对 Swoole Server 通过 set 方法设置 max_coroutine 参数,
用于配置一个 Worker 进程最多可存在的协程数量。因为随着 
Worker 进程处理的协程数目的增加,其对应占用的内存也会随之增加,
为了避免超出 PHP 的 memory_limit 限制,
请根据实际业务的压测结果设置该值,Swoole 的默认值为 100000
( Swoole 版本小于 v4.4.0-beta 时默认值为 3000 ), 
在 hyperf-skeleton 项目中默认设置为 100000。

Hyperf 框架的官方文档中提到的 max_coroutine 参数,是 Swoole 扩展的一个配置项,用于设置单个 worker 进程中可以创建的最大协程数量。这个参数的设置需要根据你的应用需求和服务器配置来决定。

文档中提到的 Swoole 默认值可能存在一些混淆,这里解释一下:

  • Swoole 版本小于 v4.4.0-beta 时默认值为 3000 :这意味着在 Swoole 4.4.0-beta 之前的版本中,如果没有显式设置 max_coroutine,其默认值是 3000。
  • Swoole 的默认值为 100000 :这可能是指在某些特定的环境或配置下,或者在 Hyperf 框架中,max_coroutine 的默认值被设置为 100000。这并不一定是 Swoole 扩展本身的默认值,而可能是 Hyperf 框架为了优化性能而做的默认配置。

Hyperf 框架是基于 Swoole 扩展开发的,它在 Swoole 的基础上提供了一些默认配置和优化。因此,当你在 Hyperf 中看到 max_coroutine 的默认值是 100000 时,这实际上是 Hyperf 框架的默认配置,而不是 Swoole 扩展本身的默认配置。

在实际使用中,你应该根据自己的应用场景和服务器性能来调整 max_coroutine 的值。如果应用是 I/O 密集型的,并且服务器有足够的内存,可能需要增加协程的数量。但是,如果协程数量过多,可能会导致内存使用过高,或者因为频繁的上下文切换而降低性能。

此外,memory_limit 是 PHP 的配置项,用于限制 PHP 脚本可以使用的最大内存。当设置 max_coroutine 时,需要确保总的协程内存使用不会超过这个限制,否则 PHP 脚本可能会因为超出内存限制而失败。

总之,关于 max_coroutine 的默认值,应该以你所使用的 Swoole 版本或框架的文档为准,并根据实际的业务需求和服务器配置来调整这个值。

相关推荐
莫名其妙小饼干11 分钟前
网上球鞋竞拍系统|Java|SSM|VUE| 前后端分离
java·开发语言·maven·mssql
十年一梦实验室20 分钟前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
最爱番茄味29 分钟前
Python实例之函数基础打卡篇
开发语言·python
Oneforlove_twoforjob1 小时前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
engchina1 小时前
如何在 Python 中忽略烦人的警告?
开发语言·人工智能·python
向宇it1 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
诚丞成2 小时前
计算世界之安生:C++继承的文水和智慧(上)
开发语言·c++
Smile灬凉城6662 小时前
反序列化为啥可以利用加号绕过php正则匹配
开发语言·php
lsx2024062 小时前
SQL MID()
开发语言
Dream_Snowar2 小时前
速通Python 第四节——函数
开发语言·python·算法