php-fpm的优化
PHP-FPM是阻塞的单线程模型,PHP-FPM的每个进程只开启一个线程,一个线程同时只能服务一个请求。
怎么理解这句话呢?
这段话描述了 PHP-FPM(PHP FastCGI Process Manager)的运行模型和特性:
阻塞的单线程模型:PHP-FPM 使用阻塞的单线程模型,这意味着每个 PHP-FPM 进程只能同时处理一个请求。这与一些其他 Web 服务器或应用服务器采用的多线程或多进程模型有所不同。
每个进程只开启一个线程:在 PHP-FPM 中,每个进程都只开启一个线程来处理请求。这表示在同一时间内,一个 PHP-FPM 进程只能执行一个任务。线程是操作系统进行任务调度和执行的基本单元。
一个线程同时只能服务一个请求:由于 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当中也有进城池的概念:
这些参数在www.conf 配置文件当中存在, 是 PHP-FPM 进程管理器中的一部分,通过调整它们的值,你可以优化 PHP-FPM 的性能和资源利用情况。下面详细解释这些参数的含义和最优设置大小:
pm.max_children
(最大子进程数):- 含义:指定 PHP-FPM 进程池中最大子进程的数量。
- 最优设置:最优大小取决于服务器的内存和性能。通常,你希望
pm.max_children
设置为能够满足同时处理的并发请求的数量,同时不会导致服务器内存耗尽。计算方式可以根据服务器内存和每个 PHP-FPM 进程的内存占用来估算。在给定内存下,可用内存除以单个 PHP-FPM 进程的内存占用,就是最大子进程数的一个合理估计。
pm.start_servers
(初始进程数):- 含义:指定 PHP-FPM 进程池启动时初始子进程的数量。
- 最优设置:通常,你希望
pm.start_servers
设置为一个较大的值,以确保在服务器启动时有足够的进程来处理初始请求负载。
pm.min_spare_servers
(最小空闲进程数):- 含义:指定 PHP-FPM 进程池中最小空闲子进程的数量。
- 最优设置:根据服务器负载和性能需求,设置
pm.min_spare_servers
为确保在空闲时仍有足够进程来处理请求。
pm.max_spare_servers
(最大空闲进程数):- 含义:指定 PHP-FPM 进程池中最大空闲子进程的数量。
- 最优设置:根据服务器负载和性能需求,设置
pm.max_spare_servers
为确保不会因过多空闲进程而浪费资源。
pm.max_requests
(最大多少次请求后子进程重生):- 含义:指定每个 PHP-FPM 子进程服务的最大请求数。当达到此次数时,该子进程将被重启。
- 最优设置:用于避免 PHP 进程长时间运行导致内存泄漏。设置适当的值,以确保 PHP 进程定期重启,释放内存资源。通常可根据应用的内存使用情况和负载来设置。
请注意,这些参数的最优值取决于具体的服务器配置和应用程序需求。进行调整时,建议先进行性能测试,观察服务器的负载和性能表现,然后根据测试结果调整这些参数以达到最佳性能。
设置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的状态信息
但是这些状态信息是什么意思呢?
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
指令
这样我们就可以快速定位php-fpm的错误信息了
如何记录php-fpm的访问日志呢?
找到usr/local/php/etc/php-fpm.d/www.conf 配置文件
因为我们在php-fpm.conf当中配置了error_log日志的路径是/usr/local/php/log 所以php-fpm.log 和这里我们上图当中的access访问日志的log都会在该目录下被创建
当你访问php文件的时候访问日志就会在www.access.log 当中被记录下来 不过不建议开启该日志 直接去看nginx或者apache的日志就行了
如何配置php-fpm慢查询日志呢?
比如你请求一个方法执行了5s是应该被php-fpm慢执行日志记录下来的,今天我们就来配置一下
还是找到php-fpm的www.conf 配置文件
因为我们在php-fpm.conf当中配置了error_log的路径所以也会在同样的路径下生成慢执行日志
然后我们在nginx当中的html当中写一个index.php文件 里面sleep(5)睡眠5s
然后去请求一下可以看到在/usr/local/php/log目录下就有了对应的慢执行日志文件
我们看看里面具体的内容是什么?
被记录的一清二楚
增大php-fpm打开文件数量的限制
单个php-fpm线程能打开的文件的数量设置为65535 让每个php-fpm进程没有硬件上的限制
如何设置每个php-fpm进程占用的内存的大小?
直接在php.ini配置文件当中设置即可
如何设置每个php-fpm进程的超时时间?
直接在php.ini文件当中设置即可
本作品采用《CC 协议》,转载必须注明作者和本文链接
写的挺好的