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

时间:2013-11-14 07:29:30

标签: redis go

我正在使用Redis网站上建议的Redigo连接器(https://github.com/garyburd/redigo)在Golang中使用redis。

我有:

  • 每次拨号()后,我推迟一个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 个答案:

答案 0 :(得分:8)

我不知道你使用哪个驱动程序,但是使用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

答案 1 :(得分:4)

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

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

ulimit -n 99999