linxiaoziruo
V2EX  ›  Java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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