33 | 加餐3:定位应用问题,排错套路很重要
33 | 加餐3:定位应用问题,排错套路很重要
讲述:王少泽
时长23:16大小21.31M
在不同环境排查问题,有不同的方式
生产问题的排查很大程度依赖监控
分析定位问题的套路
分析和定位问题需要注意的九个点
重点回顾
思考与讨论
赞 21
提建议
精选留言(19)
- hellojd置顶2020-04-09我们线上k8s管理服务,有时候oom,服务重启由k8s触发的,这将导致设置的生成dump 文件无效。有好的思路吗?
作者回复: 1、需要明白,xmx设置的堆只是java进程使用内存的一部分 https://stackoverflow.com/questions/53451103/java-using-much-more-memory-than-heap-size-or-size-correctly-docker-memory-limi 所以你需要通过监控排查到底哪部分内存超限,但是heap的oom dump肯定是需要做的,并且配置-XX:NativeMemoryTracking=detail -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics,需要的时候可以通过jcmd <pid> VM.native_memory summary/detail排查 2、在排查清问题之前可以适当放开k8s的limit,以便你可以观察到内存增长的区域,方便排查问题 3、可以和运维沟通一下,在oom killed的时候(oom killed应该会让pod状态变为unhealth,这个时候可以触发hook)能否做一下heapdump、jstack等,数据不要保存在容器里 当然,像Darren的回复,在死之前做几次dump也是可以的
共 3 条评论13 - Darren2020-04-09首先先试着回答下@hellojd童鞋的问题,不一定对,仅供参考:k8s应该在cpu或者内存的使用率上做报警,大于90%的时候可以dump和jstack一次,甚至jstat也可以做,然后95%的时候也同样执行一次, 甚至98或者99的时候也可以做一次,这样不仅可以保留现场,同时还可以对比。可以更好的排查问题。 说说遇到的问题吧,前几天刚刚发生的:上线了一个新功能,正常情况下没事,但是只要运行新业务, 就发现内存的使用率慢慢升高,随后导致CPU的使用率升高,最后CPU的使用率大于90%,直接出发报警,最后导致服务挂了; 在分析挂之前的dump的时候发现,JDBCClientImpl有几十万个,4G的dump文件中,JDBCClientImpl就占用了3G多,在分析jstat的文件,发现full GC特别频繁,但是回收效果并不明显,导致CPU飙升,因为使用的是vertx框架,connection是手动管理; 新功能有一个情况是A方法获取connection,但是A方法内部也要调用B方法,就把connection传递给B方法,然后在B方法中关闭链接,但是B方法并不是每次都被调用,有if条件,当时是为了做健壮性判断的,现在导致不进B方法,导致数据库连接不释放,内存使用率飙升,full GC执行多次触发CPU报警。 还有一个元数据区的问题,JDK8默认的元数据区大小是20.8M,因为class等都放在元数据去,当加载的calss文件多的时候,20.8M是不够的,只要元数据扩容,必定引起full GC,因此建议在启动的时候对于元数据区设定一个合适的大小。 试着回答下问题: 1、APP的问题就不回答了,因为没有APP的经验; 2、目前我们的监控主要是(Springboot项目)spring boot actuator+Prometheus+Grafana; spring boot actuator监控jvm内部情况; 自定义exporter采集硬件使用情况及容器内部使用情况,统一上报Prometheus,然后Grafana做显示。 非Springboot项目,采用的是自研类似spring boot actuator的功能,暴露相关的metric,也是上报Prometheus。展开
作者回复: 感谢分享
22 - 👽2020-04-09本文理解: 应对出错其实主要就是三个阶段。 1. before:保证留有合理的日志 2. ing:提供及时的预警以及监控 3. after:有充足的应对问题的应急预案,版本回滚,服务降级等 关于个人的排错过程主要是线性的。端到端的一个过程。例如:A调B,B调C,C调D。我的做法是先看A和D,两个业务端是否正常。如果都正常,ABC的顺序挨个排查。检查A是否接收到返回结果,如果没有,则检查B是否接收到返回结果。比较粗暴,但在小型业务系统里,个人感觉处理也还好。 对于与服务器不一样的问题,通常会模拟一份服务器数据,然后本地做压测模拟服务器流量。保证问题的复现,能在本地复现问题,排查基本上就不是什么难事了。这一思路在 唐扬 老师的《高并发系统设计40问》 中有提到,模拟服务器环境,其实就是尽量把流量,数据库等环境,尽量贴近服务器环境。展开
作者回复: 总结的很好
共 2 条评论10 - 👽2020-04-09真不敢相信,如此高质量的内容,竟然只是选学的不定期加餐!!!
作者回复: :)
10 - yinchi_5165642020-04-09分享几个遇到的运维犯的错误: 1、现象:同一个请求有时候能查出结果,有时候返回为空 原因:经排查是运维把应急时候用的服务器(直接返回200)误添加在了nginx代理中 2、现象:同一笔请求有时候很快,有时候超时60s 原因:运维路由规则配错导致 到mongodb 的去程和回程路径不一导致原来的mongo链接失效,client在默认情况下不会主动收回这些链接,当再次读写时就出现异常 3、现象:同一笔请求有时候慢,有时候快 原因:容器部署的服务有两个api实例假死,导致请求回源,拉低了接口整体响应的速度 目前使用到的工具 Grafana监控 主要做api接口监控 Kibana监控 主要做日志监控 听云Server 主要做服务器资源监控 还会用到arthas及MAT分析工具 最后,听老师的课程,涨了不少知识,日后写代码、分析问题有点点底气了,感谢老师无私的分享!展开
作者回复: 👍🏻
共 2 条评论7 - 技术骨干2020-04-16内存的问题,搁以前我基本分析不出来
作者回复: 后面有加餐会带你详细分析
4 - 👽2020-04-09如果你现在打开一个 App 后发现首页展示了一片空白,那这到底是客户端兼容性的问题,还是服务端的问题呢?如果是服务端的问题,又如何进一步细化定位呢?你有什么分析思路吗? 首先,切换设备,或者模拟请求,查看服务是否正常访问。以排除客户端问题。 确保服务端服务器状态,1确保正在运行,2资源占用处于正常状态,没有出现满载,3服务器可以被正常访问,排除网络问题。随后,备份即时的所有可能有需要的日志,条件允许尝试重启服务或者回滚,保证线上服务正常以及客户体验。时候根据遗留日志尝试进行排查。如果依然无果,模拟服务器环境和流量,进行Debug。 对于分析定位问题,你会做哪些监控或是使用哪些工具呢? 无论监控还是定位,对个人来说: 首当其冲:Top,检查内存CPU占用情况等等。定期不定期检查一下服务正常运行,并确认资源占用情况。 对于请求,个人的监控是,记录所有慢请求(处理时间过长的请求)。针对慢请求的情况分析,比如说,一个理应极快的请求出现了慢请求的情况就需要去分析,缓存问题,网络问题等等。 曾经的项目,会监控服务状态,服务如果宕机了会给相应负责人发送短信通知排查。展开
作者回复: 👍🏻
4 - Husiun2020-04-09高质量内容,期待老师的更新;个人在实际应用中还主要是top定位,课后问题1个人没有相关经验,我的思路是先定位客户端问题再一步步排查到服务端,之后再top定位具体服务问题2
- Demon.Lee2020-04-23一是,程序逻辑有问题或外部依赖慢,使得业务逻辑执行慢,在访问量不变的情况下需要更多的线程数来应对。比如,10TPS 的并发原先一次请求 1s 可以执行完成,10 个线程可以支撑;现在执行完成需要 10s,那就需要 100 个线程。 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 每秒都来10请求,10秒就是100个请求,故需要100个线程,终于想明白了,我是真的好笨😭。 老师的课破10000不是事吧,被低估了,我去部落吆喝吆喝。展开
作者回复: 👍🏻
1 - Geek_3b10962020-04-19非常实用谢谢老师
作者回复: 欢迎转发
1 - hanazawakana2020-04-12问题1,首先看下客户端的崩溃监控,再看下是不是只有这个机器有问题,如果不同机型也有问题,再看下是不是某个机器底层操作系统的问题,比如Android O,再看下是不是某个厂商操作系统的问题,如果是普遍存在的,考虑服务端问题,看下对应接口的日志有没有报错信息,如果没有日志,再分析下是不是nginx或者网络的问题1
- 不知道起啥好2022-11-13 来自浙江看了这篇文章感觉要学习的东西太多了
- 二饼2022-07-20感谢老师分享,好多干货!尝试在工作中多试试。
- Geek_a07e7d2020-11-07老师,请教个问题,k8s部署的服务怎样通过jvm自带命令查看堆栈信息
作者回复: 这是一样的 进入docker环境后执行命令 pid是1
- 荆仙2020-08-13一般如果是兼容性问题IOS或者安卓只会在其中一端出现问题,所以可以分别使用iPhone和安卓机测试。如果都有问题,大概率是服务端的问题。入股是服务端问题,可以先抓包或者通过日志的方式获取服务端的响应数据,看响应数据有何异常,然后再结合日志排查问题。
作者回复: 不错
- track66882020-06-20我想请教老师,是如何成长到这个地步的?哈哈哈
作者回复: 加餐6
- 岳宜波2020-06-03我们各个环境都会开启一个调试实例,只有添加固定的cookie的时候请求才会打到调试实例上,可以在调试实例上远程调试,不影响其他用户使用
作者回复: 不错
- Asha2020-04-26老师 非常感谢你提供的关于直接存储差问题的文章 启发了很多。有两个问题,第一个是为什么我们已经知道是直接内存的问题了,还需要先去看堆内存呢 第二个是为什么在thread local中引用的直接内存在gc的时候也不会被释放 多谢
作者回复: 这是文中作者的排查思路 你不一定需要按照这个思路来 tomcat的工作线程不会回收 引用的资源不会释放
- Asha2020-04-26老师及同学们 我这发现了一个问题,背景是这样的 小伙伴每天定时redis缓存中的数据清空,然后重新加载。然后过一个月左右就会抛oom但是是direct memory out of memory. 之前猜测是不是redis客户端从服务端拿数据的时候 连接数太多了 后来看redis的客户端是有一个连接池管理的。烦请老师和同学们提供好的思路
作者回复: 排查方式参考 https://coldwalker.com/2018/12//troubleshooter_directbytebuffer_memory_issue/
共 3 条评论