美文网首页
PHP-FPM以及performance tuning

PHP-FPM以及performance tuning

作者: 芒鞋儿 | 来源:发表于2020-12-24 13:50 被阅读0次

    PHP5之前是采用PHP-CGI,PHP-CGI是PHP解释器,它是个CGI程序,本身只能解析请求,不能管理进程。
    PHP7之后采用PHP-FPM,调度管理PHP-FastCGI进程的程序,在PHP5.3.3之前是php内核的一个补丁包,在后来的版本中php内核集成了php-fpm。(补充:PHP8增加了编译方法和一些function,在FCGI这里没有什么变化)
    FCGI原理是先fork master 进程,初始化执行过程之后,再fork worker进程。如果worker 进程不够用,master还会预先启动一些worker进程,而worker 较多的时候也会关掉一些。
    FasterCGI通过socket 和FPM(fasterCGI process manager) 进行交互,是基于socket 通信,分布式

    关键参数的设置:
    1. pm String string可能的值:static / ondemand / dynamic

      • static: 子进程child process 的数目固定,此设定下等于pm.max_children的数目
      • ondemand: 此设定下=pm.start_servers 指定的数目
      • dynamic: child process 数目由以下的参数决定:
        • pm.max_children
        • pm.start_servers
        • pm.min_spare_servers
        • pm.max_spare_servers
    2. pm.max_children
      static: 创建的子进程数目
      dynamic: 创建的最大子进程数目
      计算公式= total usable memory / 单个service 需要的大致memory
      例如,用free命令 check可用Memory 3.8G,单个service 使用memory 假定为256MB, 则max_children=3800/256≈15

    3. pm.start_servers
      master process 启动时创建的子进程数目
      default 计算公式: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
      例如:可用3.8G,实际可使用率30%~40%,则=3800x0.35/256≈5.1 ,设为5

      MS consultant advice: CPU number x 一个service 使用的memory 数目?(要确认一下会议记录)

    4. pm.min_spare_servers
      dynamic的时候有效
      idle child process 的最小值
      例如:设为和start_servers 同样数值, 设为5

    5. pm.max_spare_servers
      dynamic的时候有效
      idle child process 的最大值
      例如: 假定memory 使用率70%, 3800 x 0.7 / 256 ≈ 10.3, 设为10

    6. pm.max_requests = 500
      最大请求数:最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn一个新的。
      这个配置的主要目的是避免php解释器或程序引用的第三方库造成的内存泄露。(PHP是会造成内存泄露的!!!)

    7. pm.process_idle_time
      default = 10s

    还有一种计算方法(Sebastian Buckpesch)
    max_children = (total RAM - memory used for linux,DB, etc) / process size
    start_servers = number of CPU core x 4
    min_spare_servers = number of CPU core x 2
    max_spare_servers = start_servers
    eg. 可用memory 8G-2G=6G, php-fpm 的process size = 62.2MiB
    则 max_children = 6.192/62.2 ≈ 100,
    2个CPU,每个4core, 所以 start_servers = (2 x 4) x 4 = 32
    min_spare_servers = (2 x 4)x 2 = 16
    max_spare_servers = start_servers = 32

    参考URL:
    https://zhuanlan.zhihu.com/p/110540192
    https://zhuanlan.zhihu.com/p/137011384
    https://www.plesk.com/blog/various/why-do-you-need-php-fpm/
    https://tideways.com/profiler/blog/an-introduction-to-php-fpm-tuning
    https://qiita.com/mizutsu/items/29ec160c4e830c138132
    PHP 内核
    PHP internals book

    相关文章

      网友评论

          本文标题:PHP-FPM以及performance tuning

          本文链接:https://www.haomeiwen.com/subject/sdounktx.html