标题起得比较大,慢慢填坑
相关资料
- https://www.baeldung.com/java-memory-leaks
介绍了什么是java内存泄漏,给了部分例子 - https://www.baeldung.com/java-analyze-thread-dumps
介绍java线程栈的dump - https://www.baeldung.com/native-memory-tracking-in-jvm
介绍NMT,处理堆外内存问题时,找过不少资料都说使用nmt,但是不会用,看下这链接应该会有不少收获 - https://www.cnblogs.com/zhangyjblogs/p/14163607.html
cpu磁盘相关,主要是cpu的排查 - JAVA 线上故障排查完整套路!牛掰!https://mp.weixin.qq.com/s/I1qp1pwWJY3EeFTntA5uAQ
微信看到的,个人认为介绍比较全面,站在操作系统层面影响进程状态的因素基本都考虑进去了。主要是堆外内存的排查
案例1 系统io性能低下,导致java进程cpu偶发100%
现象:客户环境的java进程cpu偶发跳到100%,有时候持续时长一分钟。问题报告是在最后一个工作日周五,需要在周一给客户结论,周末远程时没有复现过。因此,来不及使用jstack等工具分析,信息非常有限。
分析过程:
- 当时刚参加工作没多久,第一次解这类问题既兴奋又痛苦。手上cpu100%时的资料有,cpu100%时的top录屏让你知道是哪个进程占用了cpu,系统上各个服务进程的日志。
- 埋头看日志,看了一天都没有找到关键信息,因为日志上的报错复现不了cpu100%。时间:周六
- 上级和其它服务进程日志上有打印错误的同事参与进来帮忙定位。我因为日志排查不出原因,安排去看top录屏提供异常的时间点。
- 盯着top录屏我发现了一些小规律,出现异常时wa值也是跟着高的。然后疯狂找了一波资料,向上级反馈wa偏高这个线索。
- 之后运维提供dd命令帮我们在客户环境测试了一把,复现了周五工作日时cpu异常(dd和wa的关系参考该文 http://veithen.io/2013/11/18/iowait-linux.html),运维同学帮忙测试了客户的磁盘读写能力和我们的测试环境相比低下了很多。时间:周日
总结:当时通过复现现象给了客户一个解释。后来了解到客户是升级后才出现这个问题,客户最后回滚继续用旧版本。再后来,笔者发现为什么升级后会出现磁盘问题,因为我们中间某个版本加了个需求会导致磁盘io翻倍。
经验:解决问题时,要注重了解问题的背景。是稳定环境上突然出现的问题,还是附加了什么操作才出了问题,可以少走弯路
案例2 netty堆外内存泄漏
实际遇到内存泄漏的场景千奇百怪,下面是一些配置建议:
- 增加堆外内存使用量的日志打印。在流量监控等监测日志,或者请求入口处增加堆外内存使用量的日志。内存出现异常时,直观的帮助判断是日积月累,还是突然扩张的。个人依托监控日志,发现线上环境是内存突然涨上去的,反推时间点附近的用户操作解决过问题。
- 测试环境建议netty泄漏检测等级提到最高,还有netty参数限制最大堆外内存到96m,netty在小内存的限制下不会使用池化内存,1的监控将变得精确