为了账号安全,请及时绑定邮箱和手机立即绑定

go/golang + redis 打开文件太多错误

go/golang + redis 打开文件太多错误

Go
慕姐4208626 2021-07-08 14:19:08
我在 Golang 中使用 redis和 Redis 网站建议的 Redigo 连接器 ( https://github.com/garyburd/redigo )。我有:在每次 Dial() 之后我推迟一个 Close()设置 fs.file-max = 100000设置 vm.overcommit_memory = 1禁用储蓄设置 maxclients = 100000我运行一个高流量的网站,一切运行良好约 10 分钟,我从中得到error: dial tcp 127.0.0.1:6379: too many open files然后我根本无法从我的应用程序访问 redis。我在 redis 日志中看不到任何错误或问题的提示。我该怎么做才能解决这个问题?
查看完整描述

2 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

我不知道您使用的是哪个驱动程序,但是使用redigo,您可以在池中定义多个打开的连接,然后您要做的就是在对 redis 的每个查询中,首先从池中获取一个客户端,然后关闭它,所以它返回到池中并重新使用,就像这样:


redisPool = &redis.Pool{

        MaxIdle: 3,

        MaxActive: 10, // max number of connections

        Dial: func() (redis.Conn, error) {

                c, err := redis.Dial("tcp", ":6379")

                if err != nil {

                        panic(err.Error())

                }

                return c, err

        },

}

r := redisPool.Get() // get a client from the pool

_, err = r.Do("GET one") // use the client

if err != nil {

        panic(err.Error())

}

r.Close() // close the client so the connection gets reused


查看完整回答
反对 回复 2021-07-12
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

您的问题是 Redis 无法打开新连接,然后变得无响应,您需要增加操作系统的文件描述符限制(ubuntu 默认为 1024,这可能是一个问题),它现在主导着 redis maxclients 设置。

您调整此限制的方式取决于正在运行的 os redis,在 linux 上您需要这样的东西:

ulimit -n 99999


查看完整回答
反对 回复 2021-07-12
  • 2 回答
  • 0 关注
  • 261 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信