【发布时间】:2013-09-30 09:05:06
【问题描述】:
我正在运行一个流量峰值很高的网站(大约 10,000 个在线用户),当网站超过 7,000 个在线用户时,我在使用 Predis 时遇到此错误:
PHP Fatal error: Uncaught exception 'Predis\\Connection\\ConnectionException' with message 'Connection timed out [tcp://127.0.0.1:6379]'
服务器是 Intel Xeon 3.4GHz、32GB RAM 和 SSD 磁盘,带有用于静态内容的 nginx、apache 和 mysql。内存消耗从未超过 9GB,CPU 负载峰值为 4。
我没有看到 PHP 内存错误,MySQL 也没有消失,只有这个 Redis 错误。我把超时 0 和 ?read_write_timeout=0 放在了没有运气的情况下。你能帮帮我吗?
感谢和抱歉我的英语!
【问题讨论】:
-
在非常相似的 ubuntu 40GB RAM 机器上看到同样的错误。我们最新的工作理论是这是一个操作系统级别的问题(达到一些 TCP 设置限制),但是我们已经在 php 客户端和 redis 服务器机器上提出了所有相关设置(ip_conntrack_tcp_timeout_time_wait=1,nf_conntrack_tcp_timeout_established=600,tcp_tw_recycle=1 , tcp_tw_reuse=1,并使 nf_conntrack_max 和 somaxconn 足够高)。完全摸不着头脑。
-
我也在使用 Ubuntu 12.04,并且因为这个错误而更改为 apc 商店,但我想解决它,因为 Redis 给了我一些 apc 没有的东西。
-
是的,AFAIK,APC 不支持 Redis 支持的数据结构。无论如何,我们通过一整套事情来调试它,也许我会把它们包括在这里,我们可以一起取得进展。您是否检查了两台机器上的文件限制描述符(对于运行网络服务器/Redis 的用户)?您是否提高了我上面提到的 TCP 限制?我目前正在测试将 redis 超时变量设置为 600——也许操作系统正在终止 Redis 下的连接,而 PHP 还没有意识到这一点。会回来报告的。
-
看起来将 redis 超时更改为 600 对我们有用。您可以通过在 /etc/redis/redis.conf 文件中设置超时(超时 600)然后从 redis-cli 工具运行 SET CONFIG timeout 600 来执行此操作(这样您就不需要重新启动 redis 服务器) .