4

我在高流量站点上使用 php-fpm 运行 nginx。我让 nginx 通过 tcp/ip 与 php-fpm 通信,nginx 和 php-fpm 池都在同一台服务器上运行。

当我使用 tcp/ip 让 nginx 和 php-fpm 池相互通信时,页面加载需要几(5-10)秒才能完成任何操作,当它最终开始时,它不需要时间一切都是为了完成加载。由于 php-fpm 的 statuspage 显示listen 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 后端之前要等待这么长时间吗?

为什么在使用它而不是 tcp/ip 时 UNIX 套接字会导致问题?

我尝试了什么:

尝试减少 TIME_WAIT 连接数时设置net.ipv4.tcp_tw_recyclenet.ipv4.tcp_tw_reuse1(从 30k+ 下降到 20k+)

net.core.somaxconn值从默认的 128 增加到 1024(也尝试了更高的值,但在使用 UNIX 套接字时仍然出现相同的错误)

增加了打开文件的最大数量

可能也很相关:尝试使用 lighttpd + fastcgi,在连接最终得到处理之前很长一段时间也有同样的问题。MySQL 不是太忙,不应该是等待时间长的原因。磁盘等待时间为 0%(SSD 磁盘),因此繁忙的磁盘似乎也不是罪魁祸首。

希望有人找到解决此问题的方法,并愿意分享:)

4

1 回答 1

2

在问题解决后回答我自己的问题(不确定这是否是正确的方法)。

我的问题是 APC 缓存根本不起作用。它已安装、配置和启用,但没有向其缓存中添加任何内容。从 APC 切换到 Xcache 后,加载和加载时间大幅下降。仍然不知道为什么 APC 什么也没做,但目前我很高兴问题解决了 :)

感谢你们的所有投入!

于 2012-07-28T21:53:58.357 回答