帮忙分析一个系统问题

2016-06-12 11:10:23 +08:00
 odirus

背景:我用 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 状态呢,百思不得其解。

1280 次点击
所在节点    问与答
8 条回复
odirus
2016-06-12 11:17:50 +08:00
从 redis-cli 中导出了 client list 信息,正在分析

现在已经发现了一个有意思的问题
odirus
2016-06-12 11:24:16 +08:00
发现问题了,是因为我没有在 redis 中设置 timeout 参数,目前已经已经解决大量空闲连接的问题

但是还是有个问题不明白,为什么 server-b 上可以看到与 server-a 的大量链路处于 ESTABLISHED ,但是在 server-a 上却没有呢?难道 tcp 延迟这么大,颠覆我的三观了。
hcymk2
2016-06-12 11:42:44 +08:00
http://bbs.chinaunix.net/thread-3681150-1-1.html

还有你客户端代码里面有关闭 redis 客户端么?
odirus
2016-06-12 12:09:24 +08:00
@hcymk2 使用的连接池,首先从连接池里面 get resource , 使用完之后 return resource 给连接池。使用的是 Jedis
fcicq
2016-06-12 13:40:34 +08:00
没用一个现成的 IP 库是错误啊. 这东西真的要求严格准确吗?
odirus
2016-06-12 13:43:42 +08:00
@fcicq 参考过多个 IP 库,都没有理想的,总是有一些 IP 无法被解析出来。。。所以现在的策略是优先从百度 IP 库获取信息,对获取失败的 IP 进行标记,当重试达到一定次数之后再异步从其他 IP 库获取进行校正

闲着没事做,自己动手丰衣足食
fcicq
2016-06-12 13:46:26 +08:00
@odirus 买高春辉的库啊. 工程师还是太便宜.
odirus
2016-06-12 13:51:29 +08:00
@fcicq
劳动力太廉价了, 不过现在功能已经满足需求了,没必要获取整个 IP 库,毕竟不是所有人都使用服务,哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/285062

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX