redis - 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=1
并net.core.somaxconn=512
在服务器上设置。
单次使用 API 没有问题。当处于压力之下时,比如每秒 4000 个请求,它会在第一个 10 秒内工作,然后变得非常慢并且无法及时响应(开始时规定的 3 毫秒)。
当我检查 ActiveCount 和 IdleCount 时,值在 2 到 5 之间并且始终相同。MaxActive 值为 10.000 是否应该有更多的连接?还是我错过了一些关键设置?
解决方案
整个问题不依赖于 redis。端口监听的套接字被淹没,因为在压力测试时 TCP 连接没有正确关闭。
这导致 time_wait-state 中的连接数约为 60k。当使用实时流量而不是 jMeter 进行压力测试时,该问题已得到解决。
推荐阅读
- javascript - 如果数组中不存在该元素,有什么方法可以添加元素。添加以逗号分隔的元素?
- algorithm - 从列表坐标中找到二维空间中的最小距离坐标
- javascript - rubico 的 `map.pool` 数组实现
- amazon-web-services - AWS CloudWatch 代理失败 - 刷新 EC2 实例标签失败:RequestError:发送请求失败
- react-native - react-navigation:当条件语句为真时,如何隐藏一个特定的 tabBar 图标和标签
- java - 过滤器列表等于参数
- angularjs - 检查调用函数时传递了哪些参数
- javascript - 将 Skulpt 与 React 一起使用
- kubernetes - 是否有“普通”kubernetes 和“气隙”环境的最佳解决方案?
- go - 是否可以更改默认入口点