V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
odirus
V2EX  ›  问与答

帮忙分析一个系统问题

  •  
  •   odirus · 2016-06-12 11:10:23 +08:00 · 1276 次点击
    这是一个创建于 3076 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:我用 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 个连接了呢?

    我的排查流程:

    • 在 server-b(redis) 上执行 "netstat -anp | grep server-a-ip | wc -l" 的确几大千的连接,并且都是 ESTABLISHED 状态。
    • 我在 server-a(java task) 上执行 "netstat -anp | grep server-b-ip:6379"。。。然后我就惊讶了,为毛我这里只显示两条链路到达 server-b 呢?是我执行命令的姿势不对吗?

    Append: 我通过 server-b 上的 redis monitor 查看 1465701291.014345 [0 server-a-ip:39680] 这类信息,的确只看到了两条链路,两个端口

    但是为啥在 server-b 上执行 netstat -anp | grep server-a-ip 时有真么多都处于 ESTABLISHED 状态呢,百思不得其解。

    8 条回复    2016-06-12 13:51:29 +08:00
    odirus
        1
    odirus  
    OP
       2016-06-12 11:17:50 +08:00
    从 redis-cli 中导出了 client list 信息,正在分析

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

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

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

    闲着没事做,自己动手丰衣足食
    fcicq
        7
    fcicq  
       2016-06-12 13:46:26 +08:00
    @odirus 买高春辉的库啊. 工程师还是太便宜.
    odirus
        8
    odirus  
    OP
       2016-06-12 13:51:29 +08:00
    @fcicq
    劳动力太廉价了, 不过现在功能已经满足需求了,没必要获取整个 IP 库,毕竟不是所有人都使用服务,哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5845 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:58 · PVG 10:58 · LAX 18:58 · JFK 21:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.