原地址:https://blog.csdn.net/dc_726/article/details/12340349

1.Unix域Socket通信

之前简单介绍过Unix Domain Socket这种通信方式,参见:Nginx+PHP-FPM的域Socket配置方法

Unix域Socket因为不走网络,的确可以提高Nginx和php-fpm通信的性能,但在高并发时会不稳定。

Nginx会频繁报错:

connect() to unix:/dev/shm/php-fcgi.sock failed (11: Resource temporarily unavailable) while connecting to upstream

可以通过下面两种方式提高稳定性:

1)调高nginx和php-fpm中的backlog

配置方法为:在nginx配置文件中这个域名的server下,在listen 80后面添加default backlog=1024。

同时配置php-fpm.conf中的listen.backlog为1024,默认为128。

2)增加sock文件和php-fpm实例数

再新建一个sock文件,在Nginx中通过upstream模块将请求负载均衡到两个sock文件背后的两套php-fpm实例上。


2.php-fpm参数调优

2.1进程数

php-fpm初始/空闲/最大worker进程数

pm.max_children = 300

pm.start_servers = 20

pm.min_spare_servers = 5

pm.max_spare_servers = 35

2.2最大处理请求数

最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn一个新的。

这个配置的主要目的是避免php解释器或程序引用的第三方库造成的内存泄露。

pm.max_requests = 10240

2.3最长执行时间

最大执行时间在php.ini和php-fpm.conf里都可以配置,配置项分别为max_execution_time和request_terminate_timeout。

其作用及其影响参见:Nginx中502和504错误详解


3.php-fpm的高CPU使用率排查方法

3.1CPU使用率监控方法

1)top命令

直接执行top命令后,输入1就可以看到各个核心的CPU使用率。而且通过top -d 0.1可以缩短采样时间。

下面的sar貌似最短只能是1秒。

2)sar命令

sar和iostat命令的安装:

sysstat.x86_64 : The sar and iostat system monitoring commands

yum install -y sysstat.x86_64

执行sar -P ALL 1 100。-P ALL表示监控所有核心,1表示每1秒采集,100表示采集100次。

输出结果如下:

CPU     %user     %nice   %system   %iowait    %steal     %idle

all     85.54      0.00      5.69      0.00      0.00      8.76

  0     74.75      0.00     25.25      0.00      0.00      0.00

  1     98.00      0.00      2.00      0.00      0.00      0.00

  2     89.22      0.00      3.92      0.00      0.00      6.86

  3     91.00      0.00      2.00      0.00      0.00      7.00

  4     75.00      0.00      9.00      0.00      0.00     16.00

  5     94.95      0.00      5.05      0.00      0.00      0.00

  6     95.00      0.00      4.00      0.00      0.00      1.00

  7     87.88      0.00      4.04      0.00      0.00      8.08

  8     93.94      0.00      3.03      0.00      0.00      3.03

  9     88.00      0.00      3.00      0.00      0.00      9.00

10     89.11      0.00      2.97      0.00      0.00      7.92

11     82.35      0.00      3.92      0.00      0.00     13.73

12     73.27      0.00      7.92      0.00      0.00     18.81

13     81.44      0.00      4.12      0.00      0.00     14.43

14     77.23      0.00      6.93      0.00      0.00     15.84

15     78.79      0.00      4.04      0.00      0.00     17.17

3.2开启慢日志

配置输出php-fpm慢日志,阀值为2秒:

request_slowlog_timeout = 2

slowlog = log/$pool.log.slow

利用sort/uniq命令分析汇总php-fpm慢日志:

[root@b28-12 log]# grep -v "^$" www.log.slow.tmp | cut -d " " -f 3,2 | sort | uniq -c | sort -k1,1nr | head -n 50

   5181 run() /www/test.net/framework/web/filters/CFilter.php:41

   5156 filter() /www/test.net/framework/web/filters/CFilterChain.php:131

   2670 = /www/test.net/index.php

   2636 run() /www/test.net/application/controllers/survey/index.php:665

   2630 action() /www/test.net/application/controllers/survey/index.php:18

   2625 run() /www/test.net/framework/web/actions/CAction.php:75

   2605 runWithParams() /www/test.net/framework/web/CController.php:309

   2604 runAction() /www/test.net/framework/web/filters/CFilterChain.php:134

   2538 run() /www/test.net/framework/web/CController.php:292

   2484 runActionWithFilters() /www/test.net/framework/web/CController.php:266

   2251 run() /www/test.net/framework/web/CWebApplication.php:276

   1799 translate() /www/test.net/application/libraries/Limesurvey_lang.php:118

   1786 load_tables() /www/test.net/application/third_party/php-gettext/gettext.php:254

   1447 runController() /www/test.net/framework/web/CWebApplication.php:135

参数解释:

sort:  对单词进行排序
     uniq -c:  显示唯一的行,并在每行行首加上本行在文件中出现的次数
     sort -k1,1nr:  按照第一个字段,数值排序,且为逆序
     head -10:  取前10行数据

3.3用strace跟踪进程

1)利用nohup将strace转为后台执行,直到attach上的php-fpm进程死掉为止:

nohup strace -T -p 13167 > 13167-strace.log &

参数说明:

-c 统计每一系统调用的所执行的时间,次数和出错的次数等.

-d 输出strace关于标准错误的调试信息.

-f 跟踪由fork调用所产生的子进程.

-o filename,则所有进程的跟踪结果输出到相应的filename

-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.

-h 输出简要的帮助信息.

-i 输出系统调用的入口指针.

-q 禁止输出关于脱离的消息.

-r 打印出相对时间关于,,每一个系统调用.

-t 在输出中的每一行前加上时间信息.

-tt 在输出中的每一行前加上时间信息,微秒级.

-ttt 微秒级输出,以秒了表示时间.

-T 显示每一调用所耗的时间.

-v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.

-V 输出strace的版本信息.

-x 以十六进制形式输出非标准字符串

-xx 所有字符串以十六进制形式输出.

-a column

设置返回值的输出位置.默认为40.

-e execve 只记录 execve 这类系统调用

-p 主进程号

2)也可以用利用-c参数让strace帮助汇总,非常方便非常强大!

[root@b28-12 log]# strace -cp 9907

Process 9907 attached - interrupt to quit

Process 9907 detached

% time     seconds  usecs/call     calls    errors syscall

------ ----------- ----------- --------- --------- ----------------

56.61    0.016612           5      3121           read

11.11    0.003259           1      2517       715 stat

  8.04    0.002358           7       349           brk

  6.02    0.001767           1      1315           poll

  4.28    0.001255           6       228           recvfrom

  2.71    0.000796           1       671           open

  2.54    0.000745           0      2453           fcntl

  2.37    0.000696           1      1141           write

  1.69    0.000497           1       593        13 access

  1.37    0.000403           0      1816           lseek

  0.89    0.000262           1       451        22 sendto

  0.56    0.000163           1       276       208 lstat

  0.49    0.000145           0       384           getcwd

  0.31    0.000090           0      1222           fstat

  0.28    0.000082           0       173           munmap

  0.26    0.000077           0       174           mmap

  0.24    0.000069           2        41           socket

  0.23    0.000068           0       725           close

  0.00    0.000000           0        13           rt_sigaction

  0.00    0.000000           0        13           rt_sigprocmask

  0.00    0.000000           0         1           rt_sigreturn

  0.00    0.000000           0        78           setitimer

  0.00    0.000000           0        26        26 connect

  0.00    0.000000           0        15         2 accept

  0.00    0.000000           0        39           recvmsg

  0.00    0.000000           0        26           shutdown

  0.00    0.000000           0        13           bind

  0.00    0.000000           0        13           getsockname

  0.00    0.000000           0        65           setsockopt

  0.00    0.000000           0        13           getsockopt

  0.00    0.000000           0         8           getdents

  0.00    0.000000           0        26           chdir

  0.00    0.000000           0         1           futex

------ ----------- ----------- --------- --------- ----------------

100.00    0.029344                 18000       986 total

ps:可以使用strace学习php解释器的解释执行过程

3.4加速PHP解释执行

如果自己的程序的确没有问题,只是执行了太多操作,没法再做优化了。则考虑使用APC或xcache等PHP加速器来减少CPU解释php文件的耗时。

这些PHP加速器在php文件第一次解释时会生成中间代码opcode,所以之后的执行会快很多,并且减少了一些CPU的运算。下面以xcache为例,

看下如何安装和配置。

安装xcache命令如下,./configure的参数好多不知道是做什么用的,官网上也没说明,所以只开启--enable-xcache了:

tar zxvf xcache-3.0.3.tar.gz

/usr/local/php/bin/phpize

./configure --with-php-config=/usr/local/php/bin/php-config --enable-xcache

make

make install

php.ini中配置如下,最重要的是标红的两个参数,一般推荐xcache.size根据php文件多少来定,xcache.count与CPU核心数相同:

[xcache.admin]

xcache.admin.enable_auth = Off

xcache.admin.user = "xcache"

xcache.admin.pass = ""

[xcache]

xcache.shm_scheme ="mmap"

xcache.size=1024M

xcache.count =16

xcache.slots =8K

xcache.ttl=0

xcache.gc_interval =0

xcache.var_size=16M

xcache.var_count =1

xcache.var_slots =8K

xcache.var_ttl=0

xcache.var_maxttl=0

xcache.var_gc_interval =300

xcache.test =Off

xcache.readonly_protection = Off

;xcache.readonly_protection = On

xcache.mmap_path ="/dev/zero"

;xcache.mmap_path ="/tmp/xcache"

xcache.coredump_directory =""

xcache.cacher =On

xcache.stat=On

xcache.optimizer =Off

[xcache.coverager]

;;xcache.coverager =On

;;xcache.coveragedump_directory =""

常见问题是启动php-fpm时会报错:

Cannot open or create file set by xcache.mmap_path, check the path permission or check xcache.size/var_size against system limitation

这是因为/tmp/xcache是一个文件,而不能创建成目录。

重启php-fpm服务后,用top命令观察会发现每个worker进程的VIRT(包含了swap区)都是xcache.size大小,但REQ变得很小了。

使用上面的配置在使CPU使用率的峰值时间变短了,但峰值时还是所有核心都会达到90%以上,不知道是不是哪里没有配置对。

另外高并发时,/dev/zero这种配置方式经常会导致Nginx 502错误。/tmp/xcache和开启readonly_protection则很稳定。


4.php程序性能监控

常用的方法就是开启xdebug的性能监控功能,将xdebug输出结果通过WinCacheGrind软件分析。

xdebug的安装和配合IDE调试的方法参见:Vim+XDebug调试PHP

php.ini中配置的这几项是输出性能信息的:

xdebug.auto_trace = on

xdebug.auto_profile = on
xdebug.collect_params = on
xdebug.collect_return = on
xdebug.profiler_enable = on
xdebug.trace_output_dir = "/tmp"
xdebug.profiler_output_dir ="/tmp"

这样XDebug会输出所有执行php函数的性能数据,但产生的文件也会比较大。可以关闭一些选项如collect_params、collect_return,

来减少输出的数据量。或者关闭自动输出,通过在想要监控的函数首尾调用xdebug函数来监控指定的函数。

输出的文件名类似cachegrind.out.1277560600和trace.3495983249.txt,可以拿到Windows平台下用WinCacheGrind进行图形化分析。

WinCacheGrind使用方法网上有很多介绍,这里就不详细说明了。


结束语

以上都是近期做php程序优化工作总结出的一些优化方法,还请经验丰富的大牛们提出更好的建议,共同交流、进步~


参考资料

1)php-fpm优化方法汇总

http://blog.haohtml.com/archives/11162

2)多Sock文件和php-fpm实例配置

http://xn--ghqyhzj.com/post-21537.html

Nginx+PHP-FPM优化技巧总结(转发别人的,自己留着收藏个记录用)相关推荐

  1. nginx tcp转发_Nginx性能优化技巧

    一.编译安装过程优化 1.减小Nginx编译后的文件大小 在编译Nginx时,默认以debug模式进行,而在debug模式下会插入很多跟踪和ASSERT之类的信息,编译完成后,一个Nginx要有好几兆 ...

  2. Nginx+PHP-FPM优化技巧总结 1

    Nginx+PHP-FPM优化技巧总结 这里是从网上找到的一片文章,认真的实践了一遍,有很多值得参考的地方可以学习,由于之前的文章排版非常混乱,所以本人一边学习一边加重写整理此文,所有版权归原作者所有 ...

  3. 轻量级HTTP服务器Nginx(Nginx性能优化技巧)

    一.编译安装过程优化 1.减小Nginx编译后的文件大小 在编译Nginx时,默认以debug模式进行,而在debug模式下会插入很多跟踪和ASSERT之类的信息,编译完成后,一个Nginx要有好几兆 ...

  4. 高并发环境下的Nginx该如何优化,让用户再也不会说卡

    Nginx相关性能优化 一.考虑方面: 二.压力测试工具 ab --评估服务能承载的并发 三.系统性能优化 1.文件句柄 2.文件句柄的设置方式: ①.系统全局设置(针对root用户) ②.用户局部修 ...

  5. 博客网站源代码_详解SEO布词以及网站排名优化技巧

    首先,谈谈新手以及老手在认知上容易出现的SEO误区,我认为有以下几点因素,不容忽视. 1.SEO优化就是为了排名.就是发外链 不少人认为做SEO就是为了排名,完全不考虑网站文章的质量.可读性以及用户体 ...

  6. Google News优化技巧

    Google News以机器算法自动聚合新闻内容而著名,尽管它还不完美.但可以肯定的是,无论你的新闻网站是什么类型,一旦被Google News选为新闻源,那么它将会给你的网站带去非常可观的流量及新用 ...

  7. 适合所有网站的前端优化技巧,值得你收藏!

    导读:本文虽然明指了某个主页,但是其实是适合所有网站系统前端的优化技巧的. 最近,我们将 Universe.com 主页的性能提升了十倍以上.在本文中,我们将解析实现这一重大改进的具体技术手段. 但在 ...

  8. 创意撰写优化技巧通配符

    创意撰写优化技巧 创意撰写规则 (1)标题:50字符 (2)描述1:80字符 (3)描述2:80字符 (4)访问URL:1017字符 (5)显示URL:36字符 (6)移动访问URL:1017字符 ( ...

  9. 新网站如何提升排名?网站排名提升的优化技巧分享

    新站如何提升排名?网站排名提升的优化技巧分享!新站上线,刚开始处于沙盒期,可能不容易获得排名和权重,不过,只要坚持,就会成功.那么,SEO优化究竟怎么做帮助新站提升排名?接下来,进入快速提升网站排名的 ...

  10. Mysql 语句的优化技巧

    目录 (一) MySQL 逻辑架构 (二) MySQL 存储引擎 (三) MySQL 索引 (四) MySQL 性能分析 Explain (五) MySQL 索引优化之 WHERE (六) MySQL ...

最新文章

  1. 剑指offer:面试题22. 链表中倒数第k个节点
  2. Python实现打印螺旋矩阵功能的方法
  3. 使用 Flex 布局与其他普通布局的简单对比
  4. 中专学校的计算机教什么,中专计算机学校
  5. Spring的控制反转以及依赖注入,控制反转使程序具有高拓展性。
  6. c++,static 静态成员变量 / 静态成员函数
  7. neo4j cypher_Neo4j:Cypher –避免热切
  8. 单元测试工具 Numega
  9. 负数乘以正数溢出问题
  10. 三星电子与索尼在CMOS图像传感器市场份额差距缩小
  11. WinXp系统中没有ChangeWindowMessageFilter这个函数
  12. 全面分析RHCE7(红帽认证工程师)考试题目之 ----Samba文件共享篇
  13. bootsect.exe linux,bootsect.exe
  14. 重构-使代码更简洁优美:实际经验之谈(提供一技巧,让你省掉N多代码)
  15. 设计模式之——简单工厂模式
  16. VSCode 上竟然也能约会,谈对象了???
  17. Solr 4.10.3 schema.xml 域类型详解
  18. git branch看不到分支_这份Git 日常操作清单,你都用到了吗
  19. 双拼输入法是个啥以及我是如何学会使用它的
  20. WIFI后台数据一文解释通

热门文章

  1. Vue入门指南-05 Vue实例的生命周期(快速上手vue)
  2. C# Property机制
  3. 用WPF实现在ListView中的鼠标悬停Tooltip显示
  4. React全家桶项目
  5. python获取磁盘剩余空间的方法
  6. c语言处理机调度实验报告,操作系统实验处理机调度C语言实现.docx
  7. MyBatis3源码解析(5)查询结果处理
  8. numpy 图片填充_用numpy做图像处理(上)
  9. oracle insert 触发器无效_分享一个超实用的Zabbix监控Oracle用户无效对象手册
  10. zynq无法识别sd卡_百度米尔携手推出FZ3深度学习计算卡!