habby's blog - fpm进程数
type: channel
link: https://www.habby.top/tag/fpm%E8%BF%9B%E7%A8%8B%E6%95%B0/
items: php-fpm进程数设置多少合适

php-fpm进程数设置多少合适
type: item
date: 2017-11-28T10:20:00+08:00
description: 在我们做php高并发下的优化的时候，涉及到一个问题，就是fpm进程数设置多少合适，在有的文章中推荐设置为n或者n×2（n为cpu数量）有的文档中推荐按照可用内存/30m （30m为fpm每个进程内存）两种说法其实都没有问题，但是都忽略了一个基本的事实就是具体情况具体分析基础知识本段摘自 https://yq.aliyun.com/articles/33422需要了解的参数是：pm、pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers。pm：表示使用那种方式，有两个值可以选择，就是static（静态）或者dynamic（动态）。在更老一些的版本中，dynamic被称作apache-like。这个要注意看配置文件的说明。下面5个参数的意思分别为：pm = dynamic 如何控制子进程，选项有static和dynamic pm.max_children：静态方式下开启的php-fpm进程数量 pm.max_requests：php-fpm子进程能处理的最大请求数 pm.start_servers：动态方式下的起始php-fpm进程数量 pm.min_spare_servers：动态方式下的最小php-fpm进程数 pm.max_spare_servers：动态方式下的最大php-fpm进程数量 区别：如果dm设置为 static，那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。如果dm设置为 dynamic，那么pm.max_children参数失效，后面3个参数生效。系统会在php-fpm运行开始 的时候启动pm.start_servers个php-fpm进程，然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。在高并发场景（我们公司是一万并发测试）中，一般都是采用的static方式，因为一般来说我们的服务器都是有严格的业务分离，fpm服务器就是用来作为fpm服务器使用，除去还有一个nginx之外，不会去考虑有其他的服务器占用资源。具体问题具体分析在php的运行中，无非是两种场景大运算高io1 大运算的场景，即 php程序需要用大量的cpu资源来进行数据计算之类的操作，在这种场景下，fpm进程可以设置为cpu数量的一倍或者两倍2 高io场景，php的使用场景中（最起码是本电商场景中）基本上属于高io，因为程序花了大量的时间在等待redis返回等待数据库返回。高io场景下，因为cpu大多处在wa状态下，所以可以尽量的加大fpm进程数，所以这个时候使用内存/30m是更为合理的经过我们自己真实压测，大量redis和mysql读写的io密集情况下，16G的内存，fpm我们设置为400个的时候qps比fpm 16个 32个要好不少