mre*_*mre 6 freebsd connection redis time-wait
我们目前在消息中遇到了很多 Redis 错误
无法连接:连接时读取错误,尝试下一个服务器
我们使用 PHP Redis 在 FreeBSD 上运行 Redis,我们很难在 Ubuntu 上重现该错误,因此这可能是一个提示。在 github 上有一个关于该主题的长期问题。
基本上我们通过调用connect(host, port, timeout)
phpredis从操作系统获得一个套接字,但是当我们select(db_index)
之后执行 a 时,我们得到一个异常。持久化会不会有问题?我假设 connect 在后台不执行任何操作,而 select 尝试访问实际上已关闭的连接。
我们不会遇到超时。我们尝试调整 TIME_WAIT 没有成功。
关于问题可能来自哪里的任何其他想法?跟踪问题的最佳方法是什么?dtrace 也许?
更新
我们目前正在研究我们的 BGSAVE 设置。有趣的是,为定期将数据写入磁盘(持久性)的进程创建一个 fork 需要半秒甚至更多的时间,并且可能 redisconnect()
在该时间段内无法响应请求。
我们使用以下redis 命令将错误率降低了 90% :
\n\nCONFIG SET save ""\n
Run Code Online (Sandbox Code Playgroud)\n\n这会禁用 BGSAVE,它会定期将所有数据库更改存储在磁盘上。\n连接错误的原因很可能来自于fork()
主 Redis 进程启动 BGSAVE 进程的阻塞操作。
redis.conf 说:
\n\n# Redis may block too long on the fsync() call. Note that there is no fix for\n# this currently, as even performing fsync in a different thread will block\n# our synchronous write(2) call.\n
Run Code Online (Sandbox Code Playgroud)\n\nfork()
另请参阅此处的简单机制是如何实现的。\n我们考虑使用池中的专用 Redis 服务器,该服务器将负责 BGSAVE 操作,而仅使用其他服务器进行读/写。
从 IRC 聊天来看,其他几家公司似乎也遇到了同样的错误。Bump也使用主/从系统。从站不接受连接,仅用于保存数据(请参阅此处关于 hackernews 的讨论)
\n\nHulu表示如下:\n“为了保持分片上的性能一致,我们禁用了所有分片上的磁盘写入,并且我们有一个 cron 作业每天凌晨 4 点运行,执行滚动 \xe2\x80\x9cBGSAVE\xe2\每个实例上的 x80\x9d 命令。” (看这里)
\n\n编辑:
\n\n事实证明,这只是一个临时解决方案。负载增加,我们又回到了高错误率。尽管如此,我非常有信心后台操作(例如分叉或短时间运行的后台进程)会导致错误,因为错误消息总是出现在块中。
\n\n编辑2:
\n\n由于 Redis 是单线程的,因此请始终关注长时间运行的操作,因为它们会阻塞其他所有操作。一个例子是keys *
命令。避免它并使用scan
它
归档时间: |
|
查看次数: |
1775 次 |
最近记录: |