9

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

我有:

  • 每次 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 日志中看不到任何错误或问题。我该怎么做才能解决这个问题?

4

2 回答 2

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
于 2013-11-15T01:10:20.433 回答
5

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

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

ulimit -n 99999
于 2013-11-14T08:41:14.743 回答