php-fpm如何使用动态流程管理器管理工作人员?

hen*_*rkh 5 php multithreading high-load nginx

我想澄清php-fpm如何使用动态流程管理器管理工作人员.

我们假设我们有以下配置:

pm = dynamic
pm.max_children = 100
pm.start_servers = 30
pm.min_spare_servers = 20
pm.max_spare_servers = 60
Run Code Online (Sandbox Code Playgroud)
  1. 当php-fpm启动时,它会产生30个进程
  2. 没有联系.根据min_spare_servers设置,php-fpm会关闭10名工作人员吗?如果是,在什么时候会发生?
  3. 有4个与nginx的连接.php-fpm会与单独的worker一起服务每个连接,并立即产生额外的worker来满足剩余的连接吗?
  4. 有8个连接到nginx.php-fpm在推出60名工作人员之后会如何表现?和(3)中的相同?
  5. 有120个与nginx的连接.将100名工人分配到100个连接后会发生什么?php-fpm是否使用某些队列进行连接?它会限制nginx吗?php-fpm会开始删除与" 服务器达到pm.max_children设置 " 消息的连接吗?
    1. 有0个与nginx的连接.nginx会从100回到60个连接吗?还是50?它会立即杀死40名工人还是会等待一段时间?

如你所见,这是关于php-fpm如何管理进程的一个普遍问题.更具体地说,我想了解php-fpm中pm.max_childrenpm.max_spare_servers之间的区别.

ant*_*tov 8

首先,让我们假设我们谈到上游的连接/请求,而不是nginx连接,php-fpm服务.

  1. 没有联系.根据min_spare_servers设置,php-fpm会关闭10名工作人员吗?如果是,在什么时候会发生?

不,根据我的测试,主过程不会根据min_spare_servers数量终止额外的工人.也许,指定start_servers等于是一个好习惯min_spare_servers.

  1. 有4个与nginx的连接.php-fpm会与单独的worker一起服务每个连接,并立即产生额外的worker来满足剩余的连接吗?

与php-fpm的正确,同时连接将与单独的工作人员一起提供.如果请求的数量超过start_servers主进程将分叉额外的工作者(fpm_children_make调用),最多max_spare_servers.

  1. 有8个连接到nginx.php-fpm在推出60名工作人员之后会如何表现?和(3)中的相同?

它会根据需要分配尽可能多的工人来同时处理所有请求,直到它达到max_children数字; fpm主进程每秒执行一次维护(fpm_pctl_perform_idle_server_maintenance调用):如果生成的工作数超过max_spare_servers,则处于空闲状态的工作程序将向SIGCHLD主进程(fpm_got_signalfpm_children_bury调用)发送信号.

  1. 有120个与nginx的连接.将100名工人分配到100个连接后会发生什么?php-fpm是否使用某些队列进行连接?它会限制nginx吗?php-fpm会开始删除与"服务器达到pm.max_children设置"消息的连接吗?

正确,您将在调试模式下关注消息: seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers

  1. 有0个与nginx的连接.nginx会从100回到60个连接吗?还是50?它会立即杀死40名工人还是会等待一段时间?

处于空闲状态的所有工作人员将被终止,主程序将在max_spare_servers达到数字后停止终止.
参数min_spare_serversmax_spare_servers负责同时处于空闲状态的工作的最小和最大数量.


为了理解dipper,尝试打开调试日志php-fpm.conf: ... error_log = /var/log/php5-fpm/fpm-daemon.log ... log_level = debug ... 遵循日志文件:tail -f /var/log/php5-fpm/fpm-daemon.log并使用Apache基准工具ab来了解行为.

  • 启用状态页面,您可以获得与队列相关的一些数据.参数`listen queue len`定义了可以排队的最大连接数.这个数字在池配置中定义 - "listen.backlog".由于php-fpm使用文件/ tcp套接字,因此该数字受限于系统变量,该变量在`/ proc/sys/net/core/somaxconn中定义 (3认同)