首页 > 解决方案 > Redigo 连接池 - 如何获得更多连接?

问题描述

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

API 有 3ms 的响应时间,并且在单次使用中成功,而响应时间只需要 0.5ms - 0.8ms。对 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 是否应该有更多的连接?还是我错过了一些关键设置?

标签: redisredigogo-swagger

解决方案


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

这导致 time_wait-state 中的连接数约为 60k。当使用实时流量而不是 jMeter 进行压力测试时,该问题已得到解决。


推荐阅读