php-fpm优化,3种运行模式详解

三种工作模式

ondemand,static,dynamic(内存优先、静态池、服务优先)

ondemand

php-fpm启动的时候不会启动worker进程,按需启动worker,有链接进来后,才会启动

listen = 127.0.0.1:9001
pm = ondemand 
pm.process_idle_timeout = 60
pm.max_children = 10

连接到来时(只有链接,不没有数据也会创建,telnet也会创建),创建新worker进程,worker进程数的创建收max_children设置限制,也受限于全局的process.max设置(三种模式都受限此,下文中有全局配置项讲解),如果空闲时间超过了process_idle_timeout的设置就会销毁worker进程

  • 优点:按流量需求创建,不浪费系统资源,
  • 缺点:因为php-fpm是短连接的,如果每次请求都先建立连接,大流量场景下会使得master进程变得繁忙,浪费cpu,不适合大流量模式
  • 不推荐使用此模式

dynamic

会初始化创建一部分worker,在运行过程中,动态调整worker数量,最大worker数受pm.max_children和process.max

listen = 127.0.0.1:9001
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 6
  1. 当空闲进程数小于min_spare_servers时,创建新的子进程,总子进程数小于等于pm.max_children,小于等于process.max
  2. 当空闲进程数大于max_spare_servers,会杀死启动时间最长的子进程
  3. 如果子进程(idle状态)数大于max_children,会打印warning日志,结束处理
  4. process小于 max_children ,计算一个num,启动num个worker
  5. 优点:动态扩容,不浪费系统资源
  6. 缺点:所有worker都在工作,新的请求到来需要等待创建worker进程,最长等待1s(内部存在一个1s的定时器,去查看,创建进程),频繁启停进程消耗cpu,请求数稳定,不需要频繁销毁

static

启动固定大小数量的worker,也有1s的定时器,用于统计进程的一些状态信息,例如空闲worker个数,活动worker个数

pm.max_children = 10   #必须配置这个参数,而且只有这个参数有效
  1. 优点:不用动态判断负载,提升性能
  2. 缺点:如果配置成static,只需要考虑max_children数量,数量取决于cpu的个数和应用的响应时间,一次启动固定大小进程浪费系统资源

模式选择

  1. 静态适合大内存机器,动态适合小内存服务器,2g,ondemand模式适合微小的内存,2g以下
  2. 进程数不是越多越好,进程数增多会增加进程管理开销以及进程上下文切换,并发执行数也不会超过cpu核数,cpu密集型,pm.max_children不能超过cpu内核数,如果不是可以将pm.max_children的值设置大于cpu核数
  3. 动态建立进程个数

    • N+20% 到 M/m之间
    • N是cpu核数,M是内存,m是每个php进程内存数
  4. 静态进程个数

    • M/(m*1.2)
    • pm.max_requests, 设置最大请求数,达到这个数量以后,会自动长期worker进程,繁殖内存意外增长

其他配置讲解

# 全局设置
process.max = 10 #最大进程数

# www.conf
user = nobody # 进程发起的用户和用户组,nobody为任意用户,user必须设置,group不用
group = www

listen = [::]:9000

pm = dynamic   # 进程池管理器如何控制子进程数量,static,静态,固定值  dynamic 动态 ondemand
pm.max_children = 16    # 同一时刻能够存活的最大子进程数
pm.start_servers = 4    # 启动时启动的子进程数
pm.min_spare_servers = 2   # 处于空闲 idle状态的最小进程,如果空闲进程数量小于这个值,那么相应的子进程会被创建, 可以有效的减少创建的进程数,请求处理不过来,才会循序渐进的创建 
pm.max_spare_servers = 16   # 最大空想进程数,空闲子进程数超过这个值,那么相应的子进程会被杀掉
catch_workers_output = yes  # worker进程的标准输出和错误输出会重定向到错误日志中,没有设置会输出到/dev/null

;slowlog = xxx   # 默认关闭,慢日志路径
;request_slowlog_timeout = 0   # 脚本执行超过多久就记录到日志文件
阅读 347

推荐阅读