bug analysis

Table of Contents

title

本文记录对问题诊断的学习或者说为本人的备忘录,便于以后温故而知新,前部分是对常见的场景的排查思路,后部分主要为对常见command的总结(已知请skip)虽然将工具的总结置于文末,但是就好比如何将大象装进冰箱这个问题,了解了思路,但是具体如何落地呢
对于javaer来说,show me u code才是关键

分析

本章节是对常见问题的考虑和解决思路的探究

cpu占用高

todo: 最近太忙了,先过段时间

技术栈

其实这里称之为技术栈并不妥当,主要还是从层次上分析工具的结构

  1. java包括jstack,jmap,arthas.etc
  2. jvm包括gdb,strace.etc
  3. os包括perf,bcc,bpftrace.etc
  4. hardware 包括top(cpu),free(memory),iostat(disk),iftop(network)
  5. network包括ngrep,tcpdump.etc
  6. software包括ps,netstat.etc

分析视角

自底向上

  1. 进程占用
  2. 线程占用
  3. 代码占用

自顶向下(负载)

  1. controller/rpc 耗时
  2. mapper/rpc 耗时
  3. sql execute/ java code execute 耗时

USE 观测法

  1. 使用率(utilization)
  2. 饱和度(saturation)
  3. 错误(errors)

以java的threadpool举例:

  • 线程池为软件资源
  • 线程池使用率: 目前正在运行任务线程数占总线程数的百分比
  • 线程池的饱和度: 目前正在线程池任务队列中排队的任务数量
  • 线程池的错误: 触发线程池拒绝策略的次数

通用思路

  1. 阅读日志(定位)
  2. 检查资源占用(分析)
  3. 使用排查工具(确认)

工具分类

这里并不齐全,但是包含主流的工具

tool 用户态 内核态
指标类 ps,netstat,arthas top ,free,iostat,iftop,sar
剖析类 jstack,jmap,arthas,gdb perf.bcc
剖析类 arthas,gdb perf,bcc,bpftrace,tcpdump

java

java层面的分析工具,一个图形化,一个命令行

arthas

alibaba的开源框架真的很强

visualvm

感觉是分析java软件的top 1,最关键的是它是开源的

log view

工具十分丰富,本人了解的more,less,head,tail,cat,grep,awk,慎用cat这种全量加载的command, 不要对vim或者vi过度依赖,存在和cat相同的问题

less

Syntax Description
f 向前翻页
b 向后翻页
q exit
/xxx 搜索xxx
& + ! + xx 过滤包含xxx的日志
less xxx.jar 查看 jar包

combine

  1. history | less 查看当前host的operation history,效果如下
 2836  git add lary-api-stream/
 2837  cd /opt/maven/conf
 2839  vim settings.xml
 2840  poweroff
 2841  sudo pacman -Syu
 2842  reboot
 2843  exit
 2844  ls
 2845  less jmeter.log
 2846  ls -al jmeter.log
 2847  echo 3479731/1024
 2849  less jmeter.log -N
 2850  less jmeter.log 
 2851  history less
  1. ps -ef |less 查看进程信息并分页,效果就不必演示

grep

awk

wc

sort

vim

vimset list 会显示空格,在写sh文件的时候防止错误 alt text

hardware view

top

free

slabtop

df

iostat

sar

dstat

pidstat

software view

ps

netstat

ss

lsof

fuser