服务端问题排查与系统优化方法
2020-11-13 本文已影响0人
Real_man
在面试时,必不可少的一项就是考察候选人的问题解决能力,如何排查XX问题?如何优化XX系统性能。会使用工具并不能体现不出大家的差别,出现问题时,谁能最快的定位问题与解决问题才能体现出技术水平,而只会问题排查还不够,再勤劳的救火队友也是没有实际业务上的产出,如何通过系统化的手段优化系统,让系统不再出现问题,那升职加薪指日可待。
面试时,我一般会问:你在做项目的过程中有遇到过什么问题吗?一般是怎么解决的?
如果回答是,我遇到了差不多XX问题,还有XX问题,那这种问题一般太偏向于一个点,而不够系统,相比对工作问题也没有很好的总结。
我认为比较好的方式可以参考下面的文章回答,工作中大致遇到过那种类型的问题,一般的解决套路是什么,有哪些常见的问题解决工具。如果进一步谈到避免问题出现,进行系统上优化,取得了什么成效... 那基本上这个候选人就通过了.
假如满分100分的话:
- 只回答遇到问题的一个点: 50分
- 回答大致有哪些类型的问题: 60分
- 回答常见类型问题与如何应对:80
- 回答常见类型问题,如何应对,以及排查工具:90
- 回答到了不同的问题种类,应对方式,常用工具,以及优化手段:满分...
问题排查
日常工作中,可以尝试积累自己的一项问题清单列表,出现问题时依次检查此刻的问题能对应到清单中的那个问题上:
- 逻辑错误: NPE,边界问题,死循环
- 性能问题: RT陡增,吞吐量上不去,CPU飙高,负载过高
- 内存问题:频繁FullGC,OOM,内存泄漏
- 并发问题:分布式锁不生效,重复调用,超卖
- 数据问题:脏数据,数据异常
- 人为问题:配置错误,删库跑路...
- ...
需要自己平时做一些积累,遇到的错误进行记录与复盘,总结与梳理,到形成自己的一套问题列表,并且能进行针对性的解决。
排查过程
- 快速止血:回滚,开关,降级,重启,隔离
- 保留现场:GCDump,ThreadDump
- 定位原因:尝试复现问题,找到根本原因
- 解决问题:
排查工具
日志:阿里云SLS,ELK,内部分布式日志系统
监控:
- 系统监控:CPU,内存,网络,硬盘。 一般在机器上安装agent收集机器信息
- 调用链监控:Cat,EagleEye,Zipkin+Slueth。 分布式系统不同模块之间的调用链路追踪,定位问题系统
- 业务监控:Prometheus,实时业务数据报表 。 和业务相关数据,一般系统服务的技术或业务人员关注
问题定位:
- Java自带工具:jps,jstack,jmap,jvivualvm,jconsole
- Linux命令:top,tcpdump,iostat ...
- Arthas
- 现场日志
系统优化
快,稳,准:系统响应要快,系统运行要稳定,业务数据要准确
一些指标:
- 吞吐量:QPS/TPS 单位时间内能处理的请求数
- 响应时间:RT 处理单个请求花费的时长,一般会由网络传输延迟、排队延迟和实际处理耗时几个部分共同组成。
- 可伸缩性:增加机器来提升系统性能,理想情况下为线性伸缩
性能优化与做功能需求一样,都是为业务服务的。优化之前想清楚,是否真的需要这次优化,性能优化都不是免费的午餐,优化做的越多,往往可维护性也会越差
性能优化套路:从底层到每一行代码。层次划分明确,从不同的角度优化
- 机器内核,JDK,依赖中间件 (参数调整,依赖升级)
- 数据结构与算法优化,模型优化,批量,异步,并行等
- 日志异步化;
- 减少序列化和反序列化, 如果想要性能用set和get;
- Java Stream 大对象、复杂操作尽量不要用;
- 频繁的单次调用试着改为批量调用
- 代码,流程精简,减少内存开销...
稳定性优化:
- 集群高可用,健康检查,分布式协议
- 限流,降级,熔断,重试
- 资源隔离,安全生产
可维护性优化:《码出高效-阿里巴巴代码规范》
- 编码规范
- 代码重构
- 技术演进
最后
如果能总结出一套自己的问题解决方法论,那就可以很快形成与别人拉开差距的核心竞争力,我也需要再对这方面多做一些思考与梳理。