我在高流量网站上运行带有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连接数时,将net.ipv4.tcp_tw_recycle和net.ipv4.tcp_tw_reuse设置为1(从30k减少到20k)
将net.core.somaxconn值从默认值128增加到1024(尝试更高但使用UNIX套接字时仍然是相同的错误)
什么可能也非常相关:尝试使用lighttpd fastcgi,在最终处理连接之前很长一段时间都有同样的问题. MysqL不是太忙,不应该是等待时间长的原因.磁盘等待时间为0%(SSD磁盘),因此繁忙的磁盘似乎也不是罪魁祸首.
解决方法:
我的问题是APC缓存根本没有用.它已安装,配置和启用,但未向其缓存添加任何内容.从APC切换到Xcache后,负载和加载时间大幅下降.仍然不知道为什么APC什么也没做,但此刻我很高兴问题解决了:)
感谢你们的所有意见!