我在高流量网站上使用php-fpm运行nginx。我让nginx通过tcp / ip与php-fpm进行通信,nginx和运行在同一服务器上的php-fpm池。
当我使用tcp / ip让nginx和php-fpm池相互通信时,页面加载需要花费几(5-10)秒才能完成任何操作,当它最终运行时,它需要没有时间完成装载。由于php-fpm的状态页显示监听积压已满,我认为在处理请求之前需要一些时间。 Netstat在TIME_WAIT状态下显示了很多(20k +)连接,不知道这是否相关但似乎相关。
当我尝试让nginx和php-fpm通过UNIX套接字进行通信时,页面实际加载之前的时间几乎没有减少,并且在我的浏览器中完成页面之前的时间减少了1000倍。只有UNIX套接字的问题是它在日志中给了我很多错误:
*3377 connect() to unix:/dev/shm/.php-fpm1.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 122.173.178.150, server: nottherealserver.fake, request: "GET somerandomphpfile HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/.php-fpm1.sock:", host: "nottherealserver.fake", referrer: "nottherealserver.fake"
我的两个问题是:
有人知道为什么tcp / ip方法在它实际上似乎连接到php-fpm后端之前有这么大的等待吗?
为什么UNIX套接字在使用它时会导致问题而不是tcp / ip?
我尝试了什么:
尝试减少TIME_WAIT连接次数(从30k +降至20k +时)将net.ipv4.tcp_tw_recycle
和net.ipv4.tcp_tw_reuse
设置为1
将net.core.somaxconn
值从默认值128增加到1024(尝试更高但使用UNIX套接字时仍然是相同的错误)
增加了打开文件的最大数量
可能也非常相关:尝试使用lighttpd + fastcgi,在最终处理连接之前的很长一段时间内存在同样的问题。 MySQL不是太忙,不应该是等待时间长的原因。磁盘等待时间为0%(SSD磁盘),因此繁忙的磁盘似乎也不是罪魁祸首。
希望有人找到解决此问题的方法,并愿意分享:)
答案 0 :(得分:2)
自问题解决后回答我自己的问题(不确定这是否是正确的方法)。
我的问题是APC缓存根本没用。它已安装,配置和启用,但未向其缓存添加任何内容。从APC切换到Xcache后,负载和加载时间大幅下降。仍然不知道为什么APC什么也没做,但此刻我很高兴问题得到解决:)
感谢你们的所有意见!