9

Redis Web サイトで提案されている Redigo コネクタ ( https://github.com/garyburd/redigo )を使用して、Golang で redis を使用しています。

私は持っている:

  • すべての Dial() の後、Close() を延期します
  • fs.file-max = 100000 に設定します。
  • vm.overcommit_memory = 1 を設定します
  • 無効な保存
  • maxclients = 100000 に設定

トラフィックの多い Web サイトを運営していますが、約 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 が新しい接続を開くことができず、応答しなくなることです。現在、redis の maxclients 設定を支配しているオペレーティング システムのファイル記述子の制限を増やす必要があります (ubuntu のデフォルトは 1024 で、問題になる可能性があります)。

この制限を微調整する方法は、redis が実行されている OS によって異なります。Linux では、次のようなものが必要です。

ulimit -n 99999
于 2013-11-14T08:41:14.743 に答える