API单位误解造成的严重故障
如果无法正常显示,请先停止浏览器的去广告插件。
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:<gc log文件>
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以及技巧请关注