V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
snappyone
V2EX  ›  程序员

分布式系统的正确 debug 姿势求解

  •  
  •   snappyone · 2019-04-19 21:33:13 +08:00 · 4961 次点击
    这是一个创建于 2039 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在接手的一个算比较大型的分布式系统,一起有 4,5 个大模块,每个模块都是一个独立的 jvm,互相依赖。在 idea 中 debug 发现一旦时间过长就会各种 connection timeout,heart beat 超时,导致不得不重启系统,或者傻乎乎得打印日志。

    尝试过修改一些心跳包的超时参数,但是因为刚接手不是很熟悉,外加很多地方参数甚至需要代码层面修改,感觉不仅麻烦而且容易出问题,所以想请教下有什么比较好的 debug 姿势,目前尝试了 btrace,可以注入一些方法进行参数的打印,但是还是不够方便,大神们有没有什么好的方法求指教

    25 条回复    2019-04-21 11:21:16 +08:00
    holyghost
        1
    holyghost  
       2019-04-19 21:38:50 +08:00 via iPhone
    jepsen 让你更强大
    snappyone
        2
    snappyone  
    OP
       2019-04-19 21:44:39 +08:00
    @holyghost 去搜了下,这个好像是做测试用的,如果开发时候在 ide 里面 debug 好像不行
    billlee
        3
    billlee  
       2019-04-19 21:49:02 +08:00
    一般单步调试的时候都是在一个 jvm 里面加载所有模块的
    reus
        4
    reus  
       2019-04-19 21:53:06 +08:00
    打印日志不仅不傻乎乎,还是正确的 debug 方法。很多分布式算法都很讲究时间,哪里能让你停下来的?
    jokerlee
        5
    jokerlee  
       2019-04-19 22:33:48 +08:00 via Android
    可以用 arthas 这种工具,不需要加断点
    night98
        6
    night98  
       2019-04-20 01:31:03 +08:00
    第一种:timeout 设置永不超时
    第二种:写个 aop 切 service 层方法出入参
    limuyan44
        7
    limuyan44  
       2019-04-20 06:11:34 +08:00 via Android
    大部分分布式都是靠日志
    snappyone
        8
    snappyone  
    OP
       2019-04-20 07:07:45 +08:00
    @reus
    @limuyan44 打 log 的问题就是做一个小修改得把系统重启一把,这个时间有点久
    snappyone
        9
    snappyone  
    OP
       2019-04-20 07:08:00 +08:00
    @jokerlee Arthas 试了下,确实比 btrace 方便的感觉
    zhangyp123
        10
    zhangyp123  
       2019-04-20 08:11:22 +08:00
    分布式调用链
    tony601818
        11
    tony601818  
       2019-04-20 08:31:39 +08:00
    分布系统多打 log 是万金油,ide 里 debug 就只能伪分布了。
    xuanbg
        12
    xuanbg  
       2019-04-20 08:32:00 +08:00
    先靠日志确定问题点,一般如果抛异常,直接就能定位问题代码了。如果没有抛异常,不能确定具体是哪段代码出问题再上调试。
    dazhangpan
        13
    dazhangpan  
       2019-04-20 08:46:12 +08:00   ❤️ 1
    分布式 tracing
    coffeSlider
        14
    coffeSlider  
       2019-04-20 09:14:20 +08:00 via Android
    监控+log
    tinybaby365
        15
    tinybaby365  
       2019-04-20 09:50:58 +08:00
    opentracing
    v2dead
        16
    v2dead  
       2019-04-20 10:27:30 +08:00
    当年跟一条 log 连着跳了三四台机器跟踪过去,有一种名侦探狄人杰的感觉。
    reus
        17
    reus  
       2019-04-20 11:42:03 +08:00
    @snappyone 这不是打日志的问题,是你的系统启动慢的问题
    bruce00
        18
    bruce00  
       2019-04-20 11:47:49 +08:00 via iPhone
    只会用 print debug
    cabing
        19
    cabing  
       2019-04-20 12:32:18 +08:00
    找个 trace 工具啊。记录每次的调用链和参数。
    snappyone
        20
    snappyone  
    OP
       2019-04-20 17:49:46 +08:00
    @reus 我们都是一些数据处理引擎跟分布式数据库所以确实不快,但是我感觉每次打 log 要重启多个系统,就算启动快也是大问题
    version
        21
    version  
       2019-04-20 20:51:18 +08:00
    ide 的那些 debug 断点都是骗人的..提高不了效率.
    真正的调试是代码的日志 log.没别的.这个是以前开发留给你的坑.
    snappyone
        22
    snappyone  
    OP
       2019-04-20 21:06:53 +08:00
    @version 为什么这么说呢,个人感觉如果是单体应用用 debug 断点配合合适的 log 应该更方便吧
    autogen
        23
    autogen  
       2019-04-20 22:30:17 +08:00
    打 log
    version
        24
    version  
       2019-04-21 00:41:32 +08:00
    @snappyone 服务器接口应用层不能用 debug 断点了..如果你是单应用 web 或者 app 就无所谓..如果分布式和 rpc 应用.或者游戏..只能通过 log 日志来判定..这种调试方式是等于线上排查了.所以不能按本地的调试方式.因为很多情况你单机自己跑是模拟不出来的了...所以 log 排查是唯一靠谱的..因为你 debug 断点阻塞了.所以 timeout 很正常
    tedzhou1221
        25
    tedzhou1221  
       2019-04-21 11:21:16 +08:00
    我觉得可以像#5 所说的,用 arthas,想在那个机器上打印日志都行,也不用在代码提前写打日志代码
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4922 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:52 · PVG 17:52 · LAX 01:52 · JFK 04:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.