API单位误解造成的严重故障
2020-02-23 188浏览
- 1. API单位误解造成的 严重故障 林昊 2014.4
- 2. Agenda n 故障案例分享 n Java问题排查工具箱
- 3. 故障现象 n 访问就进入如下限流页面 n 重启应用后恢复
- 4. 排查过程回顾 n 出现限流页面的原因 l 应用中活跃的线程数超过了阈值 n 最重要的是要知道这些线程都在干什么 l 不幸的是当时没做线程dump l 幸运的是有⼀一台做了heap dump
- 5. 排查过程回顾 n 分析活跃的线程在做什么 l MAT分析heap dump,查看线程状况
- 6. 排查过程回顾 n 所有活跃的http线程都在等⼀一把锁 l 到底哪个线程持有了这把锁呢 n MAT分析没有直接的线程dump文件 n 借助google查了下可能是什么原因 l google提示有可能是因为idle timeout thread
- 7. 排查过程回顾 n 持有锁的Idle Timeout Thread
- 8. 排查过程回顾 n Idle timeout thread为什么会卡住呢 l socketClose竟然⼀一直没关掉 n 查看了下内存去关连接的server l 经确认在那个时间段内对应的server集群有几台在维修; n 但为什么会导致socketClose⼀一直没关掉呢 l 代码里有调用setLinger(1000) Ø 这个会影响到关闭的速度,开发告诉我这是1s Ø 那理论上也不会卡住,于是有点怀疑...
- 9. 排查过程回顾 n 查了下setLinger的说明 l 结果这个的单位是s n 于是意味着socketClose那个地方会卡住1000s l ok,到此问题确认。
- 10. 故障案例总结 n API单位误解造成了严重故障; l 对于代码中使用到的API要清楚的知道其行为。 n 其他 l 未根据故障现象做相应的现场保留动作; n 导致排查比较折腾。 l Google是排查故障的得力帮手。
- 11. 故障案例总结 n API单位误解造成的经典故障 l 火星气候探测者号任务失败的主要原因是人为因素,因为火星气候探测者号上的飞 行系统软件使用公制单位牛顿计算推进器动力,而地面人员输入的方向校正量和推 进器参数则使用英制单位磅力,导致探测器进入大气层的高度有误,最终瓦解碎裂。 n 造成的损失估计过亿美金
- 12. Java问题排查工具箱 n 默认值相关问题 l -XX:+PrintFlagsFinal || jinfo -flags n 类装载相关问题 l -XX:+TraceClassLoading n 应用无响应相关问题 l sar等系统指标 l jstack [-l] [-m]
- 13. Java问题排查工具箱
n 内存相关问题
l -XX:+HeapDumpOnOutOfMemoryError –XX:+PrintGCDetails –XX:
+PrintGCDateStamps –Xloggc:
l jmap n -histo:live [pid] n –dump:file=<文件名>,format=b [pid] l gcore [pid] l MAT l btrace l gperftools l ulimit n cat /proc/[pid]/limits - 14. Java问题排查工具箱 n CPU利用率相关问题 l top –H+jstack l perf –top n 阿里版本的perf & JDK l jstack+btrace l blktrace+debugfs+btrace
- 15. Java问题排查工具箱 n Java进程退出相关问题 l core dump n gdb l dmesg | grep –i kill l hs_err_pid[pid].log l JDK bugs
- 16. 谢谢大家! n 更多故障排查的cases以及技巧请关注