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

2020-07-24 10:11:33 +08:00
 linxiaoziruo

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/692719

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX