服务端系统常见的一些问题

56 阅读4分钟

全链路追踪系统能发现的问题点总结

本文适用于搭建了 ARMS + SLS + Grafana 的同学,也适用于准备高级/资深后端工程师面试时对系统稳定性、性能问题的复盘与总结。


一、系统资源类问题

问题类型可观测指标示例信号
CPU 飙升CPU 使用率、线程占用CPU > 90%,单线程长期 100%
内存飙升Heap、OldGen、DirectMemoryOldGen 持续上涨,GC 后未回收
Full GC 频繁GC 次数、频率、暂停时间Full GC 时间 > 500ms 且频繁出现
线程数飙升活跃线程数、阻塞线程数Thread Live 激增,线程池打满
磁盘空间异常日志大小、分区占用日志暴增,磁盘写满报警

二、服务性能类问题

问题类型可观测指标示例信号
接口响应变慢平均响应时间(RT)、P99RT 翻倍,调用链路径异常变长
QPS 下降请求量、吞吐趋势图QPS 骤降,服务实例存活数变 0
慢调用链trace 分析某子服务响应耗时占主链路 80%
异常数量飙升SLS 日志中异常计数错误堆栈重复,5xx 突然暴增
服务不可用健康检查失败实例频繁重启,健康探针失败

三、接口异常类问题

问题类型可观测指标示例信号
接口超时超时请求数量、trace 报错trace 出现 TimeoutException
接口失败率高失败率(5xx、4xx)接口调用成功率 < 90%
缓存穿透Redis 命中率下降,后端 QPS 上升Redis 命中率 < 50%,DB QPS 暴涨
数据库慢 SQLSQL 执行耗时、慢查询日志单条 SQL > 1s,执行频繁

四、依赖服务异常类问题

问题类型可观测指标示例信号
MQ 消费积压Kafka lag、消费速率Lag 越来越大,消费线程阻塞
Redis 异常请求失败数、响应时间Redis 超时或连接失败日志频繁出现
MySQL 连接耗尽活跃连接数、连接池配置活跃连接 = 最大连接数,线程阻塞等待连接
外部依赖超时调用链 trace 监控外部 API 耗时持续上升或错误率升高

五、容量与限流问题

问题类型可观测指标示例信号
线程池满活跃线程数 > 最大线程数,拒绝次数RejectedExecutionException 频繁出现
队列堆积队列长度、等待时间消费不及时,任务积压严重
限流异常限流命中次数、Sentinel 报警限流 QPS 频繁触发,访问失败率上升

六、业务维度异常问题

问题类型可观测指标示例信号
转化率异常CTR、CVR 趋势曝光正常但转化率断崖式下降
下单量骤降下单数、支付成功数活跃用户正常但 GMV 掉线
用户量异常UV、活跃用户、请求数某渠道用户量突然归零或增长异常
日志异常激增错误关键词、堆栈关键字SLS 错误日志关键字(如 NullPointer)爆发

七、系统高可用相关问题

问题类型可观测指标示例信号
单点故障实例数变化、服务发现异常节点下线,服务失效,路由失败
服务雪崩Trace 路径级联超时、错误放大某接口失败导致整个链路阻塞
健康检查失败健康探针状态码异常/health 接口持续 500
灾备失效主备切换耗时、跨可用区超时可用区故障时,服务不可达
无限重试重试次数、异常日志关键词请求重试引发放大流量(如 Retry Storm)
配置错误发布部署成功但日志报错、QPS 异常下降发布后 CPU 飙升、服务挂掉

示例场景复盘:如何快速定位系统问题?

场景一:CPU 飙升

  • 指标:node_exporter + jstack 线程 dump
  • 动作:通过 jstack 定位热点方法栈(死循环、热代码)

场景二:Full GC 频繁

  • 指标:GC 日志 + OldGen 持续上涨
  • 动作:导出 heap dump,MAT 分析内存泄露对象

场景三:接口 RT 激增

  • 指标:ARMS 链路追踪 + Trace drill down
  • 动作:分析具体 traceId 所在链路,聚焦慢节点

场景四:数据库连接耗尽

  • 指标:连接数、连接池等待时间
  • 动作:分析慢 SQL,扩大连接池或添加限流

可用于面试的答题模板

"我们系统基于 ARMS + SLS + Grafana 搭建了全链路监控能力,对 JVM 内存、线程池、GC、依赖服务调用都有完整指标跟踪。有一次线上 Full GC 频繁,我们用 GC 日志结合 Grafana 观察到 OldGen 占用异常,dump 堆后定位是连接池未释放导致的对象泄露,最终通过关闭自动重连和设置连接最大生命周期解决。"


如需更进一步学习:可以关注系统链路追踪、接口异常链路分层设计、SLO 指标落地实践。