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

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

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

    前提是这个系统在测试环境和预发环境都没问题,就线上出问题了。因为已经上线了,所以没有办法加日志,也不能使用调试工具远程连上线上环境测试(比如 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  
       2020-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
    面向熟人编程
    Mirage09
        23
    Mirage09  
       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   ·   实用小工具   ·   2934 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 14:35 · PVG 22:35 · LAX 06:35 · JFK 09:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.