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。
3.php-fpm的高CPU利用率排查方法
3.1CPU利用率监控方法
top命令
直接实行top命令后,输入1就可以看到各个核心的CPU利用率。而且通过top -d 0.1可以缩短采样韶光。
3.2开启慢日志
配置输出php-fpm慢日志,阀值为2秒:
request_slowlog_timeout = 2
slowlog = log/$pool.log.slow
利用sort/uniq命令剖析汇总php-fpm慢日志:
grep -v \"大众^$\"大众 www.log.slow.tmp | cut -d \"大众 \公众 -f 3,2 | sort | uniq -c | sort -k1,1nr | head -n 50
参数阐明:
sort: 对单词进行排序
uniq -c: 显示唯一的行,并在每行行首加上本行在文件中涌现的次数
sort -k1,1nr: 按照第一个字段,数值排序,且为逆序
head -10: 取前10行数据
3.3用strace跟踪进程
利用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 主进程号
3.4加速PHP阐明实行
鸟哥在博客中说,提高PHP 7性能的几个tips,第一条便是开启opcache:
记得启用Zend Opcache, 由于PHP7纵然不启用Opcache速率也比PHP-5.6启用了Opcache快,
以是之前测试期间就发生了有人一贯没有启用Opcache的事情
那么什么是Opcache呢?
Opcache 的前生是 Optimizer+ ,它是PHP的官方公司 Zend 开拓的一款闭源但可以免费利用的 PHP 优化加速组件。 Optimizer+ 将PHP代码预编译天生的脚本文件 Opcode 缓存在共享内存中供往后反复利用,从而避免了从磁盘读取代码再次编译的韶光花费。同时,它还运用了一些代码优化模式,使得代码实行更快。从而加速PHP的实行。
PHP的正常实行流程如下
PHP的正常实行流程
request要求(nginx,apache,cli等)-->Zend引擎读取.php文件-->扫描其词典和表达式 -->解析文件-->创建要实行的打算机代码(称为Opcode)-->末了实行Opcode--> response 返回
每一次要求PHP脚本都会实行一遍以上步骤,如果PHP源代码没有变革,那么Opcode也不会变革,显然没有必要每次都重新天生Opcode,结合在Web中无所不在的缓存机制,我们可以把Opcode缓存下来,往后直接访问缓存的Opcode岂不是更快,启用Opcode缓存之后的流程图如下所示:
启用Opcode缓存之后的流程
Opcode cache 的目地是避免重复编译,减少 CPU 和内存开销。