我在一个高流量的网站上用php-fpm运行nginx。我让nginx通过tcp/ip与php-fpm通信,nginx和php-fpm池运行在同一台服务器上。
当我使用tcp/ip让nginx和php-fpm池相互通信时,页面加载需要几秒钟(5-10)秒才能完成任何操作,当它最终开始工作时,完全不需要任何时间完成加载。由于php-fpm的statuspage显示侦听backlog已满,因此我假设在处理请求之前需要一段时间。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而不是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磁盘),因此磁盘繁忙似乎也不是罪魁祸首。
希望有人找到了解决这个问题的方法,并愿意分享:)
发布于 2012-07-29 05:53:58
回答我自己的问题,因为问题已经解决了(不确定这是不是正确的方法)。
我的问题是APC缓存根本不起作用。它已安装、配置并启用,但没有向其缓存中添加任何内容。在从APC切换到Xcache之后,加载和加载时间有了很大的下降。仍然不知道为什么APC什么都不做,但目前我只是很高兴这个问题得到了解决:)
感谢你们的所有投入!
https://stackoverflow.com/questions/11619324
复制相似问题