我正在构建一个面向性能的 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=1
并net.core.somaxconn=512
在服务器上设置。
单次使用 API 没有问题。当处于压力之下时,比如每秒 4000 个请求,它会在第一个 10 秒内工作,然后变得非常慢并且无法及时响应(开始时规定的 3 毫秒)。
当我检查 ActiveCount 和 IdleCount 时,值在 2 到 5 之间并且始终相同。MaxActive 值为 10.000 是否应该有更多的连接?还是我错过了一些关键设置?