60s定位法
# 需要sysstat包
uptime # 平均负载
dmesg | tail # 系统日志
vmstat 1 # 虚拟内存
mpstat -P ALL 1 # cpu
pidstat 1 # 进程
iostat -xz 1 # 磁盘
free -m # 内存
sar -n DEV 1 # 网络接口吞吐量
sar -n TCP,ETCP 1 # TCP指标
top
方法论
5W2H方法论
- Who
- What
- When
- Where
- Why
- How to do
-
基础设施
cpu
通常关注CPU调度器功能和性能。
线程状态主要分析线程时间用在什么地方,线程状态分类: on-CPU,执行中,通常分为
- 用户态时间user
- 内核态时间sys
- off-CPU,等待下一轮CPU,通常分为
- 锁
- 睡眠
- 空闲
- 可执行
- 匿名换页 | 工具 | 描述 | | —- | —- | | uptime | 平均负载 | | vmstat | 系统cpu平均负载 | | mpstat | cpu核信息 | | top | 监控每个进程cpu用量 | | sar -u | cpu信息 | | pidstat | 进程cpu使用量 | | perf | cpu性能跟踪,跟踪到函数内部 |
内存
通常内存出问题不只影响性能,而是影响到服务
工具 | 描述 |
---|---|
free | 缓存容量统计信息 |
vmstat | 虚拟内存统计信息 |
top | 进程内存使用情况 |
pidstat | 活动进程内存使用 |
pmap | 进程的内存映像 |
sar -r | 查看内存 |
dtrace | 动态跟踪 |
valgrind | 内存泄漏分析 |
磁盘IO
工具 | 描述 |
---|---|
iostat | 磁盘详细统计信息 |
iotop | 按进程查看IO |
pidstat | 按进程查看IO |
perf | 动态跟踪工具 |
网络
工具 | 描述 |
---|---|
ping | ICMP包进行网络状况报告 |
traceroute | 检查链路上的网关 |
netstat | 检查端口 |
ss | socket统计,比netstat更高效 |
host | 和nslookup一样 |
tcpdump | 抓包 |
tcpflow | 面向tcp流,方便查看 |
sar -n DEV | 查看网卡 |
sar -n SOCK | 查看网络及tcp/udp状态信息 |
实战
系统负载
负载Load就是进程队列的长度,平均负载一段时间(1分钟、5分钟、15分钟)内平均Load
工具 | 描述 |
---|---|
top | 查看系统负载 |
uptime | 查看系统负载 |
strace | 统计跟踪内核态信息 |
vmstat | 负载 |
dmesg | 硬件内核信息 |
火焰图
FlameGraph主要展示CPU调用栈
- y轴表示调用栈,每一层都是一个函数,顶部就是正在执行的函数
- x轴表示抽样数,不代表时间,x越宽执行时间越长,是所有调用栈合并后按字母顺序排列
主要看哪个函数占据的宽度最大,只要有“平顶”,表示该函数可能存在问题
# yum install systemtap systemtap-runtime # uname -r #查看内核版本 # debuginfo-install --enablerepo=debuginfo search kerneldebuginfo-install --enablerepo=debuginfo search glibc
问题排查
常见问题
逻辑缺陷:NPE、死循环、边界情况未覆盖
- 性能瓶颈:接口RT陡增,吞吐率上不去
- 内存异常:GC卡顿、内存泄漏、OOM
- 并发/分布式:存在竞争条件、时钟不同步
- 数据问题:脏数据、序列化失败
- 安全问题:DDoS攻击、数据泄漏
- 环境故障:宿主机宕机、网络问题
-
排查流程
排查工具
日志对标ELK
- 监控对标Metrics
- 追踪对标Zipkin
其他工具
业务层面:流程精简、需求简化
- 编码层面:循环内减少高开销操作
- 架构层面:减少没有必要的抽象/分层
-
并行
方式:单机并行(多线程)+ 多机并行(分布式)
- 优点:充分利用计算资源
缺点:同步开销、线程开销、数据倾斜
方式:消息队列+任务线程+通知机制
- 优点:提升吞吐率、组件解耦、削峰填谷
-
批量
方式:多次单一操作合并为单次批量操作
- 优点:避免单次操作的固有开销,均摊后总开销更低
-
时空互换
空间换时间:缓存、CDN、索引、副本
-
数据结构和算法优化
数据结构:BloomFilter、
-
池化
线程池、内存池
-
稳定性
避免单点
集群部署
- 数据副本
-
故障转移Failover
接入层:DNS、VipServer、SLB
- 服务层:服务发现、健康检查、剔除机制
-
流控/限流
类型:QPS流控、并发度流控
- 工具:RateLimiter、信号量、Sentinel
-
熔断
目的:防止连锁故障、雪崩效应
- 工具:Hystrix、Failsafe、Resilience4j
- 功能:自动绕开异常服务并检测恢复状态
-
降级
触发原因:流控、熔断、负载过高
常见方式:
超时
- 避免调用端陷入永久阻塞
- 全链路自上而下规划
- Timeout VS Deadline :推荐使用绝对时间
重试
目的:防止资源被异常流量耗尽
- 资源类型:线程、队列、DB连接
- 设限方式:资源池化、有界队列
超限处理:返回ServiceUnavailable / QuotaExceeded
资源隔离
目的:防止资源被部分异常流量耗尽,为VIP客户提供QoS
-
安全生产
程序动态性:开关、配置、热升级
- 审核机制:代码Review、发布审批
-
可维护性
衡量指标
复杂度
- 编码:简洁度、命名一致性、代码行数等
- 架构:组件耦合度、职责单一性等
- 可扩展性
- 需要变更代码或配置时,是否简单优雅、不易出错
可运维性
KISS
-
优化手段
编码规范
- 编码:推荐《Java开发手册》
- 日志:无盲点、无冗余、TraceID
- 测试:代码覆盖率、自动化回归
- 代码重构
- 何时重构:代码中有bad smell
- 重构节奏:小步迭代、回归验证
- 数据驱动
- 系统数据
- 业务数据
- 技术演进
- 综合评估先进生产力
- 微服务化、容器化