背景:我用 Java 开发了一个 IP 解析程序,用于解析公司某 API 调用入口处的日志信息,主要是统计用户的活跃地区( IP 信息来源主要是百度)。目前每秒钟需要处理三百左右的 IP 信息,使用 Jedis library 。假定部署 Java 程序的服务器为 server-a(centos, java task),部署 redis 程序的服务器为 server-b(ubuntu, redis)
过程:当用户请求来到的时候,查询 redis 中是否已经缓存了该 IP 对应的地区信息,如果没有就从百度查询并且缓存到 redis 中。 redis 目前允许的最大连接数是 10000 。 jedis 配置文件中连接池最大连接数是 1024 ,等待响应时间最大是 3000 ms 。
问题:我的 redis 连接数一直在增加,没过几天就会出现连接达到最大值的错误,但是我的 jedis 配置文件明明只允许 1024 的最大连接数啊,为啥我的 redis 中已经接近 10000 个连接了呢?
我的排查流程:
Append: 我通过 server-b 上的 redis monitor 查看 1465701291.014345 [0 server-a-ip:39680] 这类信息,的确只看到了两条链路,两个端口
但是为啥在 server-b 上执行 netstat -anp | grep server-a-ip 时有真么多都处于 ESTABLISHED 状态呢,百思不得其解。
1
odirus OP 从 redis-cli 中导出了 client list 信息,正在分析
现在已经发现了一个有意思的问题 |
2
odirus OP 发现问题了,是因为我没有在 redis 中设置 timeout 参数,目前已经已经解决大量空闲连接的问题
但是还是有个问题不明白,为什么 server-b 上可以看到与 server-a 的大量链路处于 ESTABLISHED ,但是在 server-a 上却没有呢?难道 tcp 延迟这么大,颠覆我的三观了。 |
3
hcymk2 2016-06-12 11:42:44 +08:00 1
|
4
odirus OP @hcymk2 使用的连接池,首先从连接池里面 get resource , 使用完之后 return resource 给连接池。使用的是 Jedis
|
5
fcicq 2016-06-12 13:40:34 +08:00
没用一个现成的 IP 库是错误啊. 这东西真的要求严格准确吗?
|