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

三种工做模式

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

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.maxphp-fpm

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. 动态创建进程个数spa

    • 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   # 脚本执行超过多久就记录到日志文件
相关文章
相关标签/搜索