php-fpm的优化

PHP-FPM 是阻塞的单线程模型,PHP-FPM 的每个进程只开启一个线程,一个线程同时只能服务一个请求。#

怎么理解这句话呢?

这段话描述了 PHP-FPM(PHP FastCGI Process Manager)的运行模型和特性:

  1. 阻塞的单线程模型:PHP-FPM 使用阻塞的单线程模型,这意味着每个 PHP-FPM 进程只能同时处理一个请求。这与一些其他 Web 服务器或应用服务器采用的多线程或多进程模型有所不同。

  2. 每个进程只开启一个线程:在 PHP-FPM 中,每个进程都只开启一个线程来处理请求。这表示在同一时间内,一个 PHP-FPM 进程只能执行一个任务。线程是操作系统进行任务调度和执行的基本单元。

  3. 一个线程同时只能服务一个请求:由于 PHP-FPM 采用单线程模型,因此一个 PHP-FPM 进程在同一时刻只能服务一个请求。这表示当一个请求被处理时,其他请求需要等待,直到当前请求完成。

这种模型的优点是简单、可靠,适用于处理中小规模的 Web 请求。每个 PHP-FPM 进程独立运行,相互之间不会影响,这有助于隔离问题和提高稳定性。然而,对于高并发的场景,可能需要考虑采用其他更多线程或多进程的服务器模型,以更有效地处理大量请求。

总体来说,这种单线程、单进程的模型使得 PHP-FPM 在很多情况下表现出色,特别是在共享主机环境或低到中等流量的网站中。

这也就意味着多个 php-fpm 进程是不是可以同时处理多个请求#

多个 PHP-FPM 进程能够同时处理多个请求。PHP-FPM 是一种进程管理器,每个 PHP-FPM 进程都可以独立运行,并且能够处理一个或多个请求。

在 PHP-FPM 的工作模式下,多个进程并行运行,每个进程都可以同时处理一个请求。这是通过多进程和多线程的机制实现的。每个 PHP-FPM 进程都有其独立的资源和环境,因此它们不会相互干扰。这使得 PHP-FPM 能够有效地应对并发请求,提高服务器的性能和响应能力。

PHP-FPM 进程的数量可以通过配置文件中的 pm.max_children 参数进行设置。这个参数决定了同时运行的 PHP-FPM 进程的最大数量。通过合理配置这个参数,你可以根据服务器的硬件和性能需求来优化 PHP-FPM 的并发处理能力。

总体而言,PHP-FPM 的多进程模型使得它能够有效地处理大量并发请求,是一个常用于 PHP 应用程序的高性能选项。

开过多的 php-fpm 进程会不会占用太多的内存?#

其实可以通过如下命令来查看 php-fpm 占用的总的内存大小:

ps aux |grep php-fpm|awk '{mem+=$6}END{print mem}'

如下图所示:
php-fpm的优化

php-fpm 当中也有进城池的概念:#

这些参数在 www.conf 配置文件当中存在,是 PHP-FPM 进程管理器中的一部分,通过调整它们的值,你可以优化 PHP-FPM 的性能和资源利用情况。下面详细解释这些参数的含义和最优设置大小:

  1. pm.max_children(最大子进程数):

    • 含义:指定 PHP-FPM 进程池中最大子进程的数量。
    • 最优设置:最优大小取决于服务器的内存和性能。通常,你希望 pm.max_children 设置为能够满足同时处理的并发请求的数量,同时不会导致服务器内存耗尽。计算方式可以根据服务器内存和每个 PHP-FPM 进程的内存占用来估算。在给定内存下,可用内存除以单个 PHP-FPM 进程的内存占用,就是最大子进程数的一个合理估计。
  2. pm.start_servers(初始进程数):

    • 含义:指定 PHP-FPM 进程池启动时初始子进程的数量。
    • 最优设置:通常,你希望 pm.start_servers 设置为一个较大的值,以确保在服务器启动时有足够的进程来处理初始请求负载。
  3. pm.min_spare_servers(最小空闲进程数):

    • 含义:指定 PHP-FPM 进程池中最小空闲子进程的数量。
    • 最优设置:根据服务器负载和性能需求,设置 pm.min_spare_servers 为确保在空闲时仍有足够进程来处理请求。
  4. pm.max_spare_servers(最大空闲进程数):

    • 含义:指定 PHP-FPM 进程池中最大空闲子进程的数量。
    • 最优设置:根据服务器负载和性能需求,设置 pm.max_spare_servers 为确保不会因过多空闲进程而浪费资源。
  5. pm.max_requests(最大多少次请求后子进程重生):

    • 含义:指定每个 PHP-FPM 子进程服务的最大请求数。当达到此次数时,该子进程将被重启。
    • 最优设置:用于避免 PHP 进程长时间运行导致内存泄漏。设置适当的值,以确保 PHP 进程定期重启,释放内存资源。通常可根据应用的内存使用情况和负载来设置。

请注意,这些参数的最优值取决于具体的服务器配置和应用程序需求。进行调整时,建议先进行性能测试,观察服务器的负载和性能表现,然后根据测试结果调整这些参数以达到最佳性能。

设置 php-fpm 进程池为动态调整模式:

php-fpm的优化

php-fpm的优化

通过命令可查看一共起来了多少 php-fpm 进程的个数:

php-fpm的优化

我们来看一下 php-fpm 进程状态监控#

首先在 www.conf 配置文件当中找到 pm.status_path 将其设置为:

pm.status_path = /phpstatus

然后配置 nginx:

location /phpstatus {
    fastcgi_index  index.php;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

进行访问即可拿到 php-fpm 的状态信息
php-fpm的优化
但是这些状态信息是什么意思呢?

pool: www # 进程池名称
process manager: dynamic # 进程管理方式
start time: 22/Jan/2016:15:49:00 +0800 # 启动时间
start since: 375 # 运行时长
accepted conn: 7 # 当前进程池接受的请求数
listen queue: 0 # 请求等待队列,如果不为 0 ,意味着 FPM 进程不足,需要增加
max listen queue: 0 # 最大等待队列数量
listen queue len: 1024 # SOCKET 等待队列长度
idle processes: 4 # 空闲进程数
active processes: 1 # 活跃的进程数
total processes: 5 # 总进程数
max active processes: 1 # 最大活跃进程数
max children reached: 0 # 达到最大进程数的次数,如果不为 0 ,意味着最大进程数不足,需要增加
slow requests: 0 # 慢请求数量,需要设置 slow logslow requests: 0 # 慢请求数量,需要设置 slow log

配置 php-fpm 的报错日志路径#

php-fpm 的日志路径是通过 PHP-FPM 的配置文件中的 error_log 指令进行设置的。这个指令用于指定 PHP-FPM 进程的错误日志路径。以下是设置 php-fpm 日志路径的步骤:
找到 PHP-FPM 的配置文件,通常是 usr/local/php/etc/php-fpm.conf 或者 usr/local/php/etc/php-fpm.d/www.conf(具体路径可能因发行版而异)。
在配置文件中找到 error_log 指令

CentOS 下编译安装 PHP8.0(nginx 版)

这样我们就可以快速定位 php-fpm 的错误信息了

如何记录 php-fpm 的访问日志呢?#

找到 usr/local/php/etc/php-fpm.d/www.conf 配置文件
CentOS 下编译安装 PHP8.0(nginx 版)

CentOS 下编译安装 PHP8.0(nginx 版)

因为我们在 php-fpm.conf 当中配置了 error_log 日志的路径是 /usr/local/php/log 所以 php-fpm.log 和这里我们上图当中的 access 访问日志的 log 都会在该目录下被创建

CentOS 下编译安装 PHP8.0(nginx 版)

当你访问 php 文件的时候访问日志就会在 www.access.log 当中被记录下来 不过不建议开启该日志 直接去看 nginx 或者 apache 的日志就行了

如何配置 php-fpm 慢查询日志呢?#

比如你请求一个方法执行了 5s 是应该被 php-fpm 慢执行日志记录下来的,今天我们就来配置一下
还是找到 php-fpm 的 www.conf 配置文件

php-fpm的优化

因为我们在 php-fpm.conf 当中配置了 error_log 的路径所以也会在同样的路径下生成慢执行日志
然后我们在 nginx 当中的 html 当中写一个 index.php 文件 里面 sleep (5) 睡眠 5s
然后去请求一下可以看到在 /usr/local/php/log 目录下就有了对应的慢执行日志文件

php-fpm的优化

我们看看里面具体的内容是什么?

php-fpm的优化

被记录的一清二楚

增大 php-fpm 打开文件数量的限制#

php-fpm的优化

单个 php-fpm 线程能打开的文件的数量设置为 65535 让每个 php-fpm 进程没有硬件上的限制

如何设置每个 php-fpm 进程占用的内存的大小?#

直接在 php.ini 配置文件当中设置即可

php-fpm的优化

如何设置每个 php-fpm 进程的超时时间?#

直接在 php.ini 文件当中设置即可

php-fpm的优化

本作品采用《CC 协议》,转载必须注明作者和本文链接
胡军
本帖由系统于 1年前 自动加精