首先我们关注一下PHP-FPM的运行模式:pm=staticmode:始终保持固定数量的子进程,这个数量由pm.max_children定义,这个方法是非常不灵活,通常也不是默认的。优点是不需要动态判断负载情况,提高性能;缺点是占用系统内存资源较多。在内存充足的前提下性能最强。这种模式需要设置每天固定时间重启phppm=动态模式:启动时会产生固定数量的子进程(由pm.start_servers控制),可以理解为最小数量子进程数,以及最大子进程数由pm.max_children控制,OK。在这种情况下,子进程的数量将在最大数量和最小数量之间变化。这还没有结束。空闲子进程的数量也可以通过另外两个配置来控制,即pm.min_spare_servers和pm.max_spare_servers,即空闲子进程也可以有最小和最大数量,如果空闲子进程超过pm.max_spare_servers,则杀了。pm=ondemand模式:此模式与pm=dynamic相反。它把内存放在第一位。它的工作方式非常简单。每个空闲进程将在连续空闲pm.process_idle_timeout秒后被杀死。使用这种模式,在服务器低峰期内存自然会减少。如果服务器长时间没有请求,则只有一个php-fpm主进程。当然缺点是遇到高峰期或者pm.process_idle_timeout的值太小的话,服务器频繁创建进程是难免的,所以pm=dynamic和pm=ondemand哪个更合适就看情况了关于实际情况。PHP-FPM子进程的数量,是不是越多越好?当然不是,pm.max_chindren,进程太多,增加了进程管理和上下文切换的开销。更重要的是,可以并发执行的php-fpm进程数不会超过CPU数。如何设置取决于您的代码。如果代码是CPU密集型的,pm.max_chindren不能超过CPU的核数。如果不是,将pm.max_chindren的值设置为大于CPU的核心数是非常明智的。国外科技巨头给出了这样一个公式:介于N+20%和M/m之间。N是CPU核心数。M是PHP可以使用的内存量。m是每个PHP进程使用的平均内存量。适用于动态方式。静态方法:M/(m*1.2)当然还有另一种安全的方式来配置max_children。适用于静态方法。首先将max_childnren设置为一个比较大的值。稳定运行一段时间后,观察php-fpm状态下的maxactive进程,配置max_children大于它。pm.max_requests:指每个子进程在重启前处理了多少请求。这个参数理论上可以随意设置,但是为了防止内存泄露的风险,最好设置一个合理的数字
