线上问题如何快速排查
《线上问题如何快速排查》共 0.3 万字,通篇围绕 缓存、并发、日志、监控 展开,归在「后端与系统架构」这一层。
适合给 AI 系统搭底座、要管得住的人
目录骨架(6 节)
- 16.线上问题如何快速排查
- jdk版本:17.0.8
- linux版本:CentOS-7.4.1708
- 本次分享内容
- 1. 硬件问题排查
- 2. 多线程并发问题排查
示例代码
📎 附件:troubleshoot-demo.zip(zip, 73KB)
原文链接:https://www.yuque.com/attachments/yuque/0/2024/zip/2424104/1714952300915-b1bbb4d0-e2ca-4a8d-929d-35b24cbe8e56.zip
jdk版本:17.0.8
linux版本:CentOS-7.4.1708
本次分享内容
- 硬件问题排查
- 多线程并发问题排查
- 内存溢出问题排查
- CPU飙高问题排查
硬件问题排查
如果一个实例发生了问题,根据情况选择,要不要着急去重启。如果出现的CPU、内存飙高或者日志里出现了 OOM异常
第一步是隔离,第二步是保留现场,第三步才是问题排查。
隔离
就是把你的这台机器从请求列表里摘除,比如把 nginx 相关的权重设成零。
现场保留
瞬时态和历史态
查看比如 CPU、系统内存等,通过历史状态可以体现一个趋势性问题,而这些信息的获取一般依靠监控系统的协作。

保留信息
- 系统当前网络连接
ss -antp >/opt/data/dump/ss.dump 2>&1
使用 ss 命令而不是 netstat 的原因,是因为 netstat 在网络连接非常多的情况下,执行非常缓慢。
后续的处理,可通过查看各种网络连接状态的梳理,来排查 TIMEWAIT 或者 CLOSEWAIT,或者其他连接过高的问题,非常有用。
- 网络状态统计
netstat -s >/opt/data/dump/netstat-s.dump 2>&1
它能够按照各个协议进行统计输出,对把握当时整个网络状态,有非常大的作用。
sar -n DEV 1 2 >/opt/data/dump/sar-traffic.dump 2>&1
在一些速度非常高的模块上,比如 Redis、Kafka,就经常发生跑满网卡的情况。表现形式就是网络通信非常缓慢。
- 进程资源
ss -antp >/opt/data/dump/ss.dump 2>&1
通过查看进程,能看到打开了哪些文件,可以以进程的维度来查看整个资源的使用情况,包括每条网络连接、每个打开的文件句柄。同时,也可以很容易的看到连接到了哪些服务器、使用了哪些资源。这个命令在资源非常多的情况下,输出稍慢,请耐心等待。
- CPU 资源
mpstat >/opt/data/dump/mpstat.dump 2>&1
vmstat 1 3 >/opt/data/dump/vmstat.dump 2>&1
sar -p >/opt/data/dump/sar-cpu.dump 2>&1
uptime >/opt/data/dump/uptime.dump 2>&1
主要用于输出当前系统的 CPU 和负载,便于事后排查。
- I/O 资源
iostat -x >/opt/data/dump/iostat.dump 2>&1
一般,以计算为主的服务节点,I/O 资源会比较正常,但有时也会发生问题,比如日志输出过多,或者磁盘问题等。此命令可以输出每块磁盘的基本性能信息,用来排查 I/O 问题。
- 内存问题
free -h >/opt/data/dump/free.dump 2>&1
free 命令能够大体展现操作系统的内存概况,这是故障排查中一个非常重要的点,比如 SWAP 影响了 GC,SLAB区挤占了 JVM 的内存。
- 其他全局
ps -ef >/opt/data/dump/ps.dump 2>&1
dmesg >/opt/data/dump/dmesg.dump 2>&1
sysctl -a >/opt/data/dump/sysctl.dump 2>&1
dmesg 是许多静悄悄死掉的服务留下的最后一点线索。当然,ps 作为执行频率最高的一个命令,由于内核的配置参数,会对系统和 JVM 产生影响,所以我们也输出了一份。
- 进程快照,最后的遗言(jinfo)
nohup java -jar -Xms256m -Xmx512m /opt/data/dump/troubleshoot-0.0.1-SNAPSHOT.jar >/opt/data/dump/troubleshoot.log 2>& 1 &
export PID=4627
jinfo $PID >/opt/data/dump/jinfo.dump 2>&1
此命令将输出 Java 的基本进程信息,包括环境变量和参数配置,可以查看是否因为一些错误的配置造成了 JVM 问题
- dump 堆信息
jstat -gcutil $PID >/opt/data/dump/jstat-gcutil.dump 2>&1
jstat -gccapacity $PID >/opt/data/dump/jstat-gccapacity.dump 2>&1