connect() to unix:/dev/shm/php-fcgi.sock failed (11: Resource temporarily unavailable) 问题解决

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秒。

 

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

 

参数解释:
     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则很稳定。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值