页面“Php-fpm子进程 运行方式之static and dynamic”与“Php7性能优化技巧”之间的差异

来自linux中国网wiki
(页面间的差异)
跳到导航 跳到搜索
(导入1个版本)
 
docker>Evan
 
第1行: 第1行:
==1.Q:问题出现==
+
= start=
<pre>有个后台挂了 今天又挂,上次是php-fpm太多导致 ,今天于是 想改一下php-fpm 进程 ,结果 pm.max_children = 512 改为 pm.max_children = 256 居然就悲伤了
+
== 0. 我们的优化参数==
 +
<pre>vi php-fpm.conf
 +
pm = static
 +
pm.max_children = 400
 +
pm.max_requests = 5000
  
[16-Feb-2017 14:36:14] ALERT: [pool www] pm.min_spare_servers(128) and pm.max_spare_servers(512) cannot be greater than pm.max_children(300)
+
request_terminate_timeout = 1
[16-Feb-2017 14:36:14] ERROR: failed to post process the configuration
+
request_slowlog_timeout = 1 </pre>
[16-Feb-2017 14:36:14] ERROR: FPM initialization failed </pre>
 
  
==2.处理过程 :==
+
== 1. Opcache ==
<pre>google 了半天 突然才起起来了我的vps我自己是用动态 pm 设置为 dynamic,而自己公司业务上很多是    static  ,于是 终于找到 相关的知识点,以前在配置 vps 时 一知半解的  dynamic 现在终于明白了 
 
  
pm运行方式,static(静态)或者dynamic(动态)。
+
编译时记得加上
 +
--enable-opcache=yes
  
pm string
+
phpinfo 查看 Zend OPcache
设置进程管理器如何管理子进程。可用值:static,ondemand,dynamic。必须设置。
+
相关的配置还不够完善 有空 再看看 
 +
[https://www.phpsong.com/1806.html php7安装opcache提升性能]
 +
http://php.net/manual/zh/intro.opcache.php
  
static - 子进程的数量是固定的(pm.max_children)。
+
[https://www.youngjuning.com/php7-0-optimize-important.html (have Opcache 配置)PHP 7.0性能优化]
ondemand - 进程在有需求时才产生(当请求时,与 dynamic 相反,pm.start_servers 在服务启动时即启动。
+
[http://www.cnblogs.com/HD/p/4554455.html PHP- 性能加速 - 开启opcache]
dynamic - 子进程的数量在下面配置的基础上动态设置:pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers。
 
  
pm.max_children:静态方式下开启的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进程。
+
记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前测试时期就发生了有人一直没有启用Opcache的事情. 启用Opcache非常简单, 在php.ini配置文件中加入:
如果dm设置为dynamic,那么pm.max_children虽然不会失效,但是主要是后面3个参数生效。后面3个参数生效,同时请注意,pm.max_spare_servers的值不能超过pm.max_children定义的值,否则php-fpm进程报错。
+
<pre>
 +
zend_extension=opcache.so
 +
opcache.enable=1
 +
opcache.enable_cli=1</pre>
  
系统会在php-fpm运行开始 的时候启动pm.start_servers个php-fpm进程,然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。
+
==2. 使用新的编译器==
  
 +
使用新一点的编译器, 推荐GCC 4.8以上, 因为只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能
  
那么,对于我们的服务器,选择哪种执行方式比较好呢?事实上,跟很多程序一样,运行的PHP程序在执行完成后,或多或少会有内存泄露的问题。这也是为什么开始的时候一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到20-30M的原因了。
 
对于内存大的服务器(比如8G以上)来说,指定静态的max_children实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。
 
因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。数量也可以根据 内存/30M 得到,比如8GB内存可以设置为100,那么php-fpm耗费的内存就能控制在 2G-3G的样子。如果内存稍微小点,比如1G,那么指定静态的进程数量更加有利于服务器的稳定。这样可以保证php-fpm只获取够用的内存,将不多的 内存分配给其他应用去使用,会使系统的运行更加畅通。
 
  
对于小内存的服务器来说,比如256M内存的VPS,即使按照一个20M的内存量来算,10个php-cgi进程就将耗掉200M内存,那系统的崩溃就应该很正常了。
+
因为centos6.8 gcc  4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) 而
因此应该尽量地控制php-fpm进程的数量,大体明确其他应用占用的内存后,给它指定一个静态的小数量,会让系统更加平稳一些。或者使用动态方式,因为动态方式会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或VPS上使用。具体最大数量根据 内存/20M 得到。比如512M的VPS,建议pm.max_spare_servers设置为20。至于pm.min_spare_servers,则建议根据服务器的负载情况来设置,比较合适的值在5~10之间。</pre>
+
cenots7 gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-11)
  
 +
所以建议php7 + centos7 才是最好的搭配
  
==3.来自官网常用选项==
 
<pre>pm.max_children int
 
pm 设置为 static 时表示创建的子进程的数量,pm 设置为 dynamic 时表示最大可创建的子进程的数量。必须设置。
 
该选项设置可以同时提供服务的请求数限制。类似 Apache 的 mpm_prefork 中 MaxClients 的设置和 普通PHP FastCGI中的 PHP_FCGI_CHILDREN 环境变量。
 
  
pm.start_servers in
+
==3. HugePage==
设置启动时创建的子进程数目。仅在 pm 设置为 dynamic 时使用。默认值:min_spare_servers + (max_spare_servers - min_spare_servers) / 2。
 
  
pm.min_spare_servers int
+
我之前的文章也介绍过: [http://www.laruence.com/2015/10/02/3069.html  让你的PHP7更快之Hugepage] , 首先在系统中开启HugePages, 然后开启Opcache的huge_code_pages.
设置空闲服务进程的最低数目。仅在 pm 设置为 dynamic 时使用。必须设置。
 
  
pm.max_spare_servers int
+
以我的CentOS 6.5为例, 通过:
设置空闲服务进程的最大数目。仅在 pm 设置为 dynamic 时使用。必须设置。
+
  sudo sysctl vm.nr_hugepages=512
  
pm.max_requests int
+
分配512个预留的大页内存:
设置每个子进程重生之前服务的请求数。对于可能存在内存泄漏的第三方模块来说是非常有用的。如果设置为 '0' 则一直接受请求,等同于 PHP_FCGI_MAX_REQUESTS 环境变量。默认值:0。</pre>
 
  
 +
<pre> cat /proc/meminfo  | grep Huge
 +
AnonHugePages:    106496 kB
 +
HugePages_Total:    512
 +
HugePages_Free:      504
 +
HugePages_Rsvd:      27
 +
HugePages_Surp:        0
 +
Hugepagesize:      2048 kB</pre>
  
==4. 参考==
+
然后在php.ini中加入:
FastCgi与PHP-fpm之间是个什么样的关系
+
opcache.huge_code_pages=1
https://segmentfault.com/q/1010000000256516
 
  
 +
这样一来, PHP会把自身的text段, 以及内存分配中的huge都采用大内存页来保存, 减少TLB miss, 从而提高性能.
  
 +
==4. Opcache file cache==
 +
开启Opcache File Cache(实验性), 通过开启这个, 我们可以让Opcache把opcode缓存缓存到外部文件中, 对于一些脚本, 会有很明显的性能提升.
 +
在php.ini中加入:
 +
opcache.file_cache=/tmp
 +
#注意这个在freebsd11 + php7  会导致502 and 504
 +
这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件, 可以跨PHP生命周期存在.
  
php-fpm.conf 全局配置
+
==5. PGO==
http://php.net/manual/zh/install.fpm.configuration.php
+
我之前的文章: [http://www.laruence.com/2015/06/19/3063.html 让你的PHP7更快(GCC PGO)]  也介绍过, 如果你的PHP是专门为一个项目服务, 比如只是为你的Wordpress, 或者drupal, 或者其他什么, 那么你就可以尝试通过PGO, 来提升PHP, 专门为你的这个项目提高性能.
 +
 +
具体的, 以wordpress 4.1为优化场景.. 首先在编译PHP的时候首先:
  
php-fpm优化
+
$ make prof-gen
https://www.zhukun.net/archives/6414
+
然后用你的项目训练PHP, 比如对于Wordpress:
  
FastCGI 进程管理器(FPM)
+
$ sapi/cgi/php-cgi -T 100 /home/huixinchen/local/www/htdocs/wordpress/index.php >/dev/null
http://php.net/manual/zh/install.fpm.php
+
也就是让php-cgi跑100遍wordpress的首页, 从而生成一些在这个过程中的profile信息.
  
 +
最后:
  
星期四 16 2月 2017
+
$ make prof-clean
 +
$ make prof-use && make install
 +
这个时候你编译得到的PHP7就是为你的项目量身打造的最高性能的编译版本.
  
[[category:php]] [[ category:ops ]]
+
 
 +
 
 +
==后记==
 +
一个php-cgi 5.3 进程,大概占用多少内存呢,大概是20MB(具体的要看你的php加载了多少模块)。可以通过pmap指令查看哪些地方占用了内存。所以,尽量不要加载不必要的php扩展模块,可以减少不必要的内存浪费。
 +
 
 +
而php-fpm(php7) 程占用14M左右; ps :php5.6的大概是19M ;
 +
 
 +
所以建议在打包时 能不要的模块尽量不要喽,虽然php哥都喜欢大而全 哈哈
 +
 
 +
php进程占用内存的大小,GB为单位
 +
ps --no-headers -o rss -C php-fpm |awk '{ sum+=$1 } END { print (sum/1024/1024,"GB") }'
 +
4.12779 GB
 +
 
 +
 
 +
[[查看php-fpm内存占用命令]]
 +
 
 +
==php7 on freebsd11==
 +
<pre>
 +
查看php 扩展目录
 +
打开phpinfo 知道了 20151012 目录 ,然后 find 一下就知道在哪了
 +
root@freebsd # find  /  -name 20151012
 +
/usr/local/lib/php/20151012</pre>
 +
 
 +
=SEE ALSO=
 +
[http://www.laruence.com/2015/12/04/3086.html 让PHP7达到最高性能的几个Tips]
 +
 
 +
[http://www.laruence.com/2015/10/02/3069.html  让你的PHP7更快之Hugepage]
 +
 
 +
[https://linux.cn/article-1537-1.html 谁贪占了我的系统资源 php-fpm]
 +
 
 +
[[category:ops]][[category:php]]

2017年9月22日 (五) 13:01的版本

start

0. 我们的优化参数

vi php-fpm.conf 
pm = static
pm.max_children = 400
pm.max_requests = 5000

request_terminate_timeout = 1
request_slowlog_timeout = 1 

1. Opcache

编译时记得加上

--enable-opcache=yes

phpinfo 查看 Zend OPcache 相关的配置还不够完善 有空 再看看 php7安装opcache提升性能 http://php.net/manual/zh/intro.opcache.php

(have Opcache 配置)PHP 7.0性能优化 PHP- 性能加速 - 开启opcache


记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前测试时期就发生了有人一直没有启用Opcache的事情. 启用Opcache非常简单, 在php.ini配置文件中加入:

zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1

2. 使用新的编译器

使用新一点的编译器, 推荐GCC 4.8以上, 因为只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能


因为centos6.8 gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) 而 cenots7 gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-11)

所以建议php7 + centos7 才是最好的搭配


3. HugePage

我之前的文章也介绍过: 让你的PHP7更快之Hugepage , 首先在系统中开启HugePages, 然后开启Opcache的huge_code_pages.

以我的CentOS 6.5为例, 通过:

 sudo sysctl vm.nr_hugepages=512

分配512个预留的大页内存:

 cat /proc/meminfo  | grep Huge
AnonHugePages:    106496 kB
HugePages_Total:     512
HugePages_Free:      504
HugePages_Rsvd:       27
HugePages_Surp:        0
Hugepagesize:       2048 kB

然后在php.ini中加入:

opcache.huge_code_pages=1

这样一来, PHP会把自身的text段, 以及内存分配中的huge都采用大内存页来保存, 减少TLB miss, 从而提高性能.

4. Opcache file cache

开启Opcache File Cache(实验性), 通过开启这个, 我们可以让Opcache把opcode缓存缓存到外部文件中, 对于一些脚本, 会有很明显的性能提升. 在php.ini中加入:

opcache.file_cache=/tmp
#注意这个在freebsd11 + php7  会导致502 and 504

这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件, 可以跨PHP生命周期存在.

5. PGO

我之前的文章: 让你的PHP7更快(GCC PGO) 也介绍过, 如果你的PHP是专门为一个项目服务, 比如只是为你的Wordpress, 或者drupal, 或者其他什么, 那么你就可以尝试通过PGO, 来提升PHP, 专门为你的这个项目提高性能.

具体的, 以wordpress 4.1为优化场景.. 首先在编译PHP的时候首先:

$ make prof-gen

然后用你的项目训练PHP, 比如对于Wordpress:

$ sapi/cgi/php-cgi -T 100 /home/huixinchen/local/www/htdocs/wordpress/index.php >/dev/null

也就是让php-cgi跑100遍wordpress的首页, 从而生成一些在这个过程中的profile信息.

最后:

$ make prof-clean
$ make prof-use && make install

这个时候你编译得到的PHP7就是为你的项目量身打造的最高性能的编译版本.


后记

一个php-cgi 5.3 进程,大概占用多少内存呢,大概是20MB(具体的要看你的php加载了多少模块)。可以通过pmap指令查看哪些地方占用了内存。所以,尽量不要加载不必要的php扩展模块,可以减少不必要的内存浪费。

而php-fpm(php7) 程占用14M左右; ps :php5.6的大概是19M ;

所以建议在打包时 能不要的模块尽量不要喽,虽然php哥都喜欢大而全 哈哈

php进程占用内存的大小,GB为单位 ps --no-headers -o rss -C php-fpm |awk '{ sum+=$1 } END { print (sum/1024/1024,"GB") }' 4.12779 GB


查看php-fpm内存占用命令

php7 on freebsd11

查看php 扩展目录
打开phpinfo 知道了 20151012 目录 ,然后 find 一下就知道在哪了 
root@freebsd # find  /  -name 20151012
/usr/local/lib/php/20151012

SEE ALSO

让PHP7达到最高性能的几个Tips

让你的PHP7更快之Hugepage

谁贪占了我的系统资源 php-fpm