Redigo 连接池——如何获取更多连接?

Redigo connection pool - how to get more connections?

我正在构建一个面向性能的 REST-API。 骨架是用 go-swagger 构建的。

API 有 3 毫秒的响应时间,并且在一次性使用中取得成功,而响应时间仅需 0.5 毫秒 - 0.8 毫秒。对 redis 进行了两次调用。

池是这样启动的:

func createPool(server string) *redis.Pool {
return &redis.Pool{ 
    MaxIdle:     500,
    MaxActive:   10000,
    IdleTimeout: 5 * time.Second,
    //MaxConnLifetime: 1800 * time.Microsecond,

    Dial: func() (redis.Conn, error) {
        c, err := redis.Dial("tcp", server)
        if err != nil {
            return nil, err
        }
        return c, err
    },

    TestOnBorrow: func(c redis.Conn, t time.Time) error {
        if time.Since(t) < (3 * time.Second) {
            return nil
        }
        _, err := c.Do("PING")
        if err != nil {
        }
        return err
    },
}

这是唯一使用游泳池的地方:

func GetValue(params Params) []int64 {
timeNow := time.Now()
conn := data.Pool.Get()
value1 := Foo(conn)
value2 := Bar(value1 , conn)
conn.Close()
defer Log(value1, value2)

return value2}

所以基本上一开始我从池中获得一个连接,用于两个 redis 请求,然后关闭它。我以前使用 defer conn.Close() ,因为它在文档中有说明,但它也没有用。 vm.overcommit_memory=1net.core.somaxconn=512 在服务器上设置。

单独使用API是没有问题的。 在压力下,比如每秒 4000 个请求,它最初工作 10 秒,然后变得非常慢并且无法及时回答(开始时规定的 3 毫秒)。

当我检查 ActiveCount 和 IdleCount 时,值介于 2 和 5 之间并且始终相同。 MaxActive 值为 10.000 时不应该有更多的连接吗?还是我遗漏了一些关键设置?

整个问题与redis无关。端口侦听的套接字被淹没,因为在压力测试时 TCP 连接没有正确关闭。

这导致 time_wait-state 中有大约 6 万个连接。当使用实时流量而不是 jMeter 进行压力测试时,问题已解决。