PHP-FPM以及performance tuning

2020-12-24  本文已影响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

上一篇 下一篇

猜你喜欢

热点阅读