V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
linxiaoziruo
V2EX  ›  Java

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

  •  1
     
  •   linxiaoziruo · Jul 24, 2020 · 9340 views
    This topic created in 2110 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

    这种题目很坑且无解,因为无论被面试者有多牛逼,这种题目,从不同角度回答,会得到完全相反且极端的评价,一般这种问题,HR 会拿来无脑选人或踢人。
    rioshikelong121
        21
    rioshikelong121  
       Jul 24, 2020
    我想问问你是面什么岗位
    kaedea
        22
    kaedea  
       Jul 24, 2020 via Android
    面向熟人编程
    NVDA
        23
    NVDA  
       Jul 24, 2020 via iPad
    发 ticket 找 oncall 啊,自己瞎折腾什么
    runningman007
        24
    runningman007  
       Jul 24, 2020
    重启
    还不行就重装系统 :)
    zh1997
        25
    zh1997  
       Jul 24, 2020
    先看服务器负载情况,查查系统瓶颈,可能是木马:top
    如果系统负载正常,看启动慢在哪:strace
    如果启动过程中需要联网考虑下路由、网关的情况
    翻翻系统日志没准能发现问题:/var/log/messages
    est
        26
    est  
       Jul 24, 2020
    @tcfenix 工具 scp 上去? hhhh
    Vkery
        27
    Vkery  
       Jul 24, 2020
    用阿里的 arthas
    lipcao
        28
    lipcao  
       Jul 24, 2020
    重点是启动慢吧,也可能初始加载数据太多了,UAT 环境数据少,生产数据多
    Jooooooooo
        29
    Jooooooooo  
       Jul 24, 2020
    人家问这问题是想看你思路
    justin2018
        30
    justin2018  
       Jul 24, 2020
    看看有没有 sleep 函数 😎
    ivyliner
        31
    ivyliner  
       Jul 24, 2020
    @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  
       Jul 24, 2020 via iPhone
    都说了启动慢…启动是一个过去状态,请问你们这么招怎么观察一个过去的状态?在这一瞬间启动然后排查?等你进完容器,都启动完了。这怎么查?拍脑袋猜?假设题主没写错题目。所有限定就是尼不能看到线上的日志,不能对线上做任何操作。那只能看源码了,看启动流程里面干了什么。在本地做测试。当然,这个还要区分是容器启动慢还是应用启动慢。原因都不一样。比如线上因为宿主机的文件句柄快用完了,啥都会启动慢。还是有很多可能的。查看宿主机监控先排除容器的问题。再处理应用的问题
    leafre
        33
    leafre  
       Jul 24, 2020
    启动慢,看启动 console 啊
    linxiaoziruo
        34
    linxiaoziruo  
    OP
       Jul 24, 2020
    各位大佬的回复我都看了。大致分为两类原因,一类是本地原因(如 CPU 过高,IO 过于密集),一类是远程交互问题(如网络不通,查询遇到慢 sql,或者消息队列消费阻塞了)。我当时也是有点懵,被面试官提到的『陌生系统』这个词给弄晕了。如果是陌生系统,那么就意味着你是不知道这个线上服务有没有和外部通信的,有没有使用消息队列或者启动的时候有没有执行数据库查询的。
    TtTtTtT
        35
    TtTtTtT  
       Jul 24, 2020
    这个 case 也太真实了吧=。=
    一个结论,不具有一般性:
    1. 用差不多 2 个小时看一下启动日志,然后看一下启动时期一些中间件的初始化耗时情况。
    2. 基本上这里的结论都没有啥用,然后会在下一个发布时间搭车加一些日志,测量一下初始化的问题具体在哪里。
    3. 发现真的解决不了问题,然后跟中间件说把发布启动超时弄长一点。
    4. 然后他们就会比较关注这个应用,跟你说哪里可以改进一下。
    KingHL
        36
    KingHL  
       Jul 24, 2020
    一看就知道是真阿里的面试题
    dany813
        37
    dany813  
       Jul 24, 2020
    学习
    windfarer
        38
    windfarer  
       Jul 24, 2020
    爪哇的程序有启动得快的吗?
    qwerthhusn
        39
    qwerthhusn  
       Jul 24, 2020
    ECS 升级啊
    lululau
        40
    lululau  
       Jul 24, 2020 via iPhone
    dtrace 吧,直接了当,Linux 就用 jvm 上特有的等价物吧
    waitingChou
        41
    waitingChou  
       Jul 25, 2020
    如果其他环境没问题就生产有问题,那理论上是程序的问题概率很小。

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

    进行不同环境的对比,找出不同项重点排查
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2434 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 144ms · UTC 11:17 · PVG 19:17 · LAX 04:17 · JFK 07:17
    ♥ Do have faith in what you're doing.