60s定位法

  1. # 需要sysstat包
  2. uptime # 平均负载
  3. dmesg | tail # 系统日志
  4. vmstat 1 # 虚拟内存
  5. mpstat -P ALL 1 # cpu
  6. pidstat 1 # 进程
  7. iostat -xz 1 # 磁盘
  8. free -m # 内存
  9. sar -n DEV 1 # 网络接口吞吐量
  10. sar -n TCP,ETCP 1 # TCP指标
  11. top

方法论

5W2H方法论

  • Who
  • What
  • When
  • Where
  • Why
  • How to do
  • How much

    基础设施

    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攻击、数据泄漏
  • 环境故障:宿主机宕机、网络问题
  • 操作失误:配置错误、删库跑路

    排查流程

    排查流程.jpg

    排查工具

  • 日志对标ELK

  • 监控对标Metrics
  • 追踪对标Zipkin
  • 其他工具

    • Arthas

      系统优化

      系统优化的三个基本方向.jpg

      性能

      性能优化.jpg
      优化手段:

      简化

  • 业务层面:流程精简、需求简化

  • 编码层面:循环内减少高开销操作
  • 架构层面:减少没有必要的抽象/分层
  • 数据层面:数据清洗、提取、聚合

    并行

  • 方式:单机并行(多线程)+ 多机并行(分布式)

  • 优点:充分利用计算资源
  • 缺点:同步开销、线程开销、数据倾斜

    • 同步优化:乐观锁、细粒度锁、无锁
    • 线程替换:协程
    • 数据倾斜:负载均衡(hash/RR/动态)

      异步

  • 方式:消息队列+任务线程+通知机制

  • 优点:提升吞吐率、组件解耦、削峰填谷
  • 缺点:队列延迟

    批量

  • 方式:多次单一操作合并为单次批量操作

  • 优点:避免单次操作的固有开销,均摊后总开销更低
  • 缺点:等待延迟+聚合延迟

    时空互换

  • 空间换时间:缓存、CDN、索引、副本

  • 时间换空间:数据压缩(http/2头部压缩、bitmap)

    数据结构和算法优化

  • 数据结构:BloomFilter、

  • 算法:递归、分治、贪心、动态规划

    池化

  • 线程池、内存池

  • DB连接池、Socket连接池

    稳定性

    稳定性优化.jpg
    优化手段:

    避免单点

  • 集群部署

  • 数据副本
  • 多机房容灾

    故障转移Failover

  • 接入层:DNS、VipServer、SLB

  • 服务层:服务发现、健康检查、剔除机制
  • 应用层:无状态设计便于随时快速切换

    流控/限流

  • 类型:QPS流控、并发度流控

  • 工具:RateLimiter、信号量、Sentinel
  • 粒度:全局、用户级、接口级

    熔断

  • 目的:防止连锁故障、雪崩效应

  • 工具:Hystrix、Failsafe、Resilience4j
  • 功能:自动绕开异常服务并检测恢复状态
  • 流程:关闭-> 打开 -> 半开

    降级

  • 触发原因:流控、熔断、负载过高

  • 常见方式:

    • 关闭非核心功能:停止应用日志打印
    • 牺牲数据时效性:返回缓存中的旧数据
    • 牺牲数据精确性:降低数据采样频率

      超时/重试

  • 超时

    • 避免调用端陷入永久阻塞
    • 全链路自上而下规划
    • Timeout VS Deadline :推荐使用绝对时间
  • 重试

    • 确保可重试操作的幂等性
    • 消息去重、异步重试、指数退避

      资源设限

  • 目的:防止资源被异常流量耗尽

  • 资源类型:线程、队列、DB连接
  • 设限方式:资源池化、有界队列
  • 超限处理:返回ServiceUnavailable / QuotaExceeded

    资源隔离

  • 目的:防止资源被部分异常流量耗尽,为VIP客户提供QoS

  • 隔离方式:队列划分、独立集群

    安全生产

  • 程序动态性:开关、配置、热升级

  • 审核机制:代码Review、发布审批
  • 灰度发布:分批部署、回滚预案

    可维护性

    相比性能和稳定性而言,可维护性所体现的价值往往是长远的。

    衡量指标

  • 复杂度

    • 编码:简洁度、命名一致性、代码行数等
    • 架构:组件耦合度、职责单一性等
  • 可扩展性
    • 需要变更代码或配置时,是否简单优雅、不易出错
  • 可运维性

    • 日志、监控是否完善
    • 部署、扩容是否容易

      优化原则

  • KISS

  • DRY

    优化手段

  • 编码规范

    • 编码:推荐《Java开发手册》
    • 日志:无盲点、无冗余、TraceID
    • 测试:代码覆盖率、自动化回归
  • 代码重构
    • 何时重构:代码中有bad smell
    • 重构节奏:小步迭代、回归验证
  • 数据驱动
    • 系统数据
    • 业务数据
  • 技术演进
    • 综合评估先进生产力
    • 微服务化、容器化