阿里面试,一个对你而言很陌生的线上系统启动慢,你会如何排查问题? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
linxiaoziruo
V2EX    Java

阿里面试,一个对你而言很陌生的线上系统启动慢,你会如何排查问题?

  •  1
     
  •   linxiaoziruo 2020-07-24 10:11:33 +08:00 9057 次点击
    这是一个创建于 1966 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前提是这个系统在测试环境和预发环境都没问题,就线上出问题了。因为已经上线了,所以没有办法加日志,也不能使用调试工具远程连上线上环境测试(比如 jvm 远程断点调试)。你只能远程连上容器操作命令行,并且排查操作不能影响线上系统的性能(比如导致吞吐量明显下降,API 反应明显变慢等)。

    41 条回复    2020-07-25 12:31:20 +08:00
    yulgang
        1
    yulgang  
       2020-07-24 10:17:59 +08:00
    主机虚拟内存使用情况; netstat 看看 Recv-Q Send-Q 情况,有时候 DNS 反向解析也可能会导致慢或者一部分功能不可用。
    wenjian881314
        2
    wenjian881314  
       2020-07-24 10:34:00 +08:00   1
    无脑 arthas
    gadsavesme
        3
    gadsavesme  
       2020-07-24 10:34:04 +08:00   1
    ng 查看下回复时间,排查是否网络原因;是否 io 密集型任务排查下系统 io 情况; cpu 是否高占用,如果高占用具体排查线程,是 gc 线程还是用户线程。数据库是否有慢查询,缓存连接情况,mq 消费是否正常,是否有三方接口响应过慢。大方向具体就想到那么多。
    fishofcat
        4
    fishofcat  
       2020-07-24 10:36:17 +08:00   15
    简单呀,找熟悉系统的人排查
    TomVista
        5
    TomVista  
       2020-07-24 10:38:00 +08:00
    所以到底出了什么问题,表现是什么? 先问清楚呗,
    TomVista
        6
    TomVista  
       2020-07-24 10:38:28 +08:00
    @TomVista 天帝玩家
    ChanKc
        7
    ChanKc  
       200-07-24 10:54:42 +08:00 via Android   4
    想到个很有趣的说法,说服务端程序的优化是启动慢没关系,要的是运行时的速度提高。而客户端的优化是启动要快,运行时稍微慢一些也没关系。
    面试问这种问题我觉得挺没意思的。在短时间内思考,自然是做过的能答出来,没做过的就答不出来。如果面试被问这个我会觉得对方在“要经验”和“要能力”之间,更倾向于前者
    xsirfly
        8
    xsirfly  
       2020-07-24 10:57:06 +08:00
    是启动慢还是系统慢,如果只是启动慢,那说明线上没问题呀,加点日志,下次上线时看看启动到底哪里慢;如果是接口慢,那就看看系统负载瓶颈呗,是 cpu 满了,内存不够了还是网卡爆了
    swulling
        9
    swulling  
       2020-07-24 10:58:26 +08:00 via iPhone
    启动慢又不是运行慢,模拟线上环境在线下尝试复现呗。

    线上即然已经上线,启动慢就不是问题,先封禁变更放着,没必要在线上 debug 。

    如果线下无法复现,就在线上找个实例,从 LB 上把流量摘了,随便打点加日志折腾
    pmispig
        10
    pmispig  
       2020-07-24 11:04:59 +08:00
    启动慢再多加一个节点不注册服务不就行了,慢慢调试啊
    tusj
        11
    tusj  
       2020-07-24 11:08:39 +08:00
    先看看启动的日志呗,大致能看到哪里慢,还能怎么着
    atonku
        12
    atonku  
       2020-07-24 11:09:22 +08:00
    重启啊
    laike9m
        13
    laike9m  
       2020-07-24 11:18:21 +08:00
    @ChanKc #7 其实我也想问为啥启动慢是个很大的问题。。
    est
        14
    est  
       2020-07-24 11:30:29 +08:00
    > 不能使用调试工具远程连上线上环境测试(比如 jvm 远程断点调试)

    > 只能远程连上容器操作命令行

    只有我一个人觉得这两个设定是矛盾的么。都能 ssh 了。为啥不能上调试工具啊。。
    tcfenix
        15
    tcfenix  
       2020-07-24 11:34:06 +08:00   3
    @laike9m
    阿里一个应用可能上千台容器,分批估计要分 6 到 8 批,每批又有几个小时的灰度观察时间,真的大型应用发布起来可以说是个体力活,超 1000 台容器的话每次启动总有几个容器会出问题,然后导致不断的重启,重启,启动速度慢能让一个系统发布发的崩溃的

    说实话,如果预发环境(这年头谁用测试环境?根本没数据没有依赖服务,有什么东西能测的?)没有问题,那肯定就是线上依赖的上下游系统出问题了,直接在代码里面看依赖了哪些上下游服务,然后点进去看他们有没有发布,基本上就破案了,如果没找到系统发布,那么就查他们配置有没有发布
    基本上到这里就没有什么问题了
    tcfenix
        16
    tcfenix  
       2020-07-24 11:44:38 +08:00
    @est
    因为那边就是这样,能 ssh 上机器,但是其他的工具不能用
    实际上 arthas 是可以用的,不过看出题人愿不愿意让你用了
    p2pCoder
        17
    p2pCoder  
       2020-07-24 11:44:45 +08:00
    新开一个服务,启动不注册服务,可以做线上 trace,定位是不是单机的问题
    除了服务本身的问题,线上 预发 测试的容器规格需要考虑
    不同环境下的实例数目需要考虑
    同时启动的服务实例数目需要考虑
    启动时候依赖的中间件 db 的负载情况 需要了解
    lazyfighter
        18
    lazyfighter  
       2020-07-24 11:54:55 +08:00
    一般经验网络不稳导致连接注册中心等很慢,不过这种情况因为内网可以忽略, 另外都是因为在启动的时候执行了过多的预加载导致的
    qiyuey
        19
    qiyuey  
       2020-07-24 12:07:35 +08:00
    Arthas
    laminux29
        20
    laminux29  
       2020-07-24 12:27:33 +08:00   1
    先查看各物理设备情况。比如 CPU 、MEM 、CACHE 、DISK 、NET 等等。

    如果物理设备没问题,多半就是代码的问题了。

    这种题目很坑且无解,因为无论被面试者有多牛逼,这种题目,从不同角度回答,会得到完全相反且极端的评价,一般这种问题,HR 会拿来无脑选人或踢人。
    rioshikelong121
        21
    rioshikelong121  
       2020-07-24 12:29:00 +08:00
    我想问问你是面什么岗位
    kaedea
        22
    kaedea  
       2020-07-24 13:16:58 +08:00 via Android
    面向熟人编程
    NVDA
        23
    NVDA  
       2020-07-24 13:18:30 +08:00 via iPad
    发 ticket 找 oncall 啊,自己瞎折腾什么
    runningman007
        24
    runningman007  
       2020-07-24 13:30:45 +08:00
    重启
    还不行就重装系统 :)
    zh1997
        25
    zh1997  
       2020-07-24 13:49:19 +08:00
    先看服务器负载情况,查查系统瓶颈,可能是木马:top
    如果系统负载正常,看启动慢在哪:strace
    如果启动过程中需要联网考虑下路由、网关的情况
    翻翻系统日志没准能发现问题:/var/log/messages
    est
        26
    est  
       2020-07-24 13:50:47 +08:00
    @tcfenix 工具 scp 上去? hhhh
    Vkery
        27
    Vkery  
       2020-07-24 14:00:15 +08:00
    用阿里的 arthas
    lipcao
        28
    lipcao  
       2020-07-24 14:21:34 +08:00
    重点是启动慢吧,也可能初始加载数据太多了,UAT 环境数据少,生产数据多
    Jooooooooo
        29
    Jooooooooo  
       2020-07-24 14:34:11 +08:00
    人家问这问题是想看你思路
    justin2018
        30
    justin2018  
       2020-07-24 14:36:51 +08:00
    看看有没有 sleep 函数
    ivyliner
        31
    ivyliner  
       2020-07-24 14:47:17 +08:00
    @linxiaoziruo 从你的描述上看启动慢的话, 可以 "系统", "容器", "网络, 业务代码上来分析
    - 系统方面: 系统当时的负载是不是比较高 ? 甚至有可能有对应的硬件故障? 比如硬盘故障导致系统启动慢 ?
    - 网络方面: 如果业务的特性, 比如业务启动需要去服务中心注册之类, 那么外部依赖, 和网络上是否有问题?
    - 容器: 容器相关的网络, IO 等也会导致慢, 比如容器常见的 DNS 的 ndot 问题
    - 业务代码: 有可能线上环境的问题, 比如业务配置文件不存在, 超时配置等不合理系列问题.

    不能影响线上系统的性能的话, 主要思路其实是要对自己执行的命令有充分的了解. 比如 strace 命令其实是会有一定的影响, 可以考虑使用 sysdig 或者 bcc 之类的命令来替代.

    最后打一个广告, 上面的各种命令, 都在我(资深的运维工程师)开发的 "小命令" 小程序里面有一定的体现, 且在持续更新中.
    ![小命令]( https://6d69-minicli-production-1302494820.tcb.qcloud.la/images/minicli.jpg?sign=4f86a9304c8bd614a003dad7c67a7ef6&t=1595572612)
    sampeng
        32
    sampeng  
       2020-07-24 15:00:35 +08:00 via iPhone
    都说了启动慢…启动是一个过去状态,请问你们这么招怎么观察一个过去的状态?在这一瞬间启动然后排查?等你进完容器,都启动完了。这怎么查?拍脑袋猜?假设题主没写错题目。所有限定就是尼不能看到线上的日志,不能对线上做任何操作。那只能看源码了,看启动流程里面干了什么。在本地做测试。当然,这个还要区分是容器启动慢还是应用启动慢。原因都不一样。比如线上因为宿主机的文件句柄快用完了,啥都会启动慢。还是有很多可能的。查看宿主机监控先排除容器的问题。再处理应用的问题
    leafre
        33
    leafre  
       2020-07-24 15:09:28 +08:00
    启动慢,看启动 console 啊
    linxiaoziruo
        34
    linxiaoziruo  
    OP
       2020-07-24 15:27:32 +08:00
    各位大佬的回复我都看了。大致分为两类原因,一类是本地原因(如 CPU 过高,IO 过于密集),一类是远程交互问题(如网络不通,查询遇到慢 sql,或者消息队列消费阻塞了)。我当时也是有点懵,被面试官提到的『陌生系统』这个词给弄晕了。如果是陌生系统,那么就意味着你是不知道这个线上服务有没有和外部通信的,有没有使用消息队列或者启动的时候有没有执行数据库查询的。
    TtTtTtT
        35
    TtTtTtT  
       2020-07-24 15:30:54 +08:00
    这个 case 也太真实了吧=。=
    一个结论,不具有一般性:
    1. 用差不多 2 个小时看一下启动日志,然后看一下启动时期一些中间件的初始化耗时情况。
    2. 基本上这里的结论都没有啥用,然后会在下一个发布时间搭车加一些日志,测量一下初始化的问题具体在哪里。
    3. 发现真的解决不了问题,然后跟中间件说把发布启动超时弄长一点。
    4. 然后他们就会比较关注这个应用,跟你说哪里可以改进一下。
    KingHL
        36
    KingHL  
       2020-07-24 17:55:33 +08:00
    一看就知道是真阿里的面试题
    dany813
        37
    dany813  
       2020-07-24 18:00:20 +08:00
    学习
    windfarer
        38
    windfarer  
       2020-07-24 18:18:07 +08:00
    爪哇的程序有启动得快的吗?
    qwerthhusn
        39
    qwerthhusn  
       2020-07-24 18:54:46 +08:00
    ECS 升级啊
    lululau
        40
    lululau  
       2020-07-24 19:04:15 +08:00 via iPhone
    dtrace 吧,直接了当,Linux 就用 jvm 上特有的等价物吧
    waitingChou
        41
    waitingChou  
       2020-07-25 12:31:20 +08:00
    如果其他环境没问题就生产有问题,那理论上是程序的问题概率很小。

    如果是我不会重点关注项目日志(因为你也不熟),而会在对比环境的差异:
    1. 生产和测试的服务配置有没有可能影响? 启动参数一样吗?
    2. 检查各环境服务器配置和负载

    进行不同环境的对比,找出不同项重点排查
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1380 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 16:57 PVG 00:57 LAX 08:57 JFK 11:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86