线上问题排查命令

性能类

诊断

  • uptimejava

  • topios

  • vmstat 1编程

  • iostat 1网络

  • dstatless

  • pidstat 1jsp

  • sar -n DEV 1maven

  • free -mtcp

网络

  • netstat -nltp
  • netstat -anpt
  • netstat -ntp | grep ‘TIME_WAIT’ | awk ‘{print 5,6}’ | awk -F ‘:’ ‘{print 1,2}’ | awk ‘{print 1,3}’ | sort | uniq -c | sort -k 1 -n -r
  • netstat -nt | grep 11300 | awk ‘{print 5}' | awk -F ':' '{print1}’ | sort | uniq -c 查看某个端口号的链接的主机数量统计
  • lsof -i:8080
  • lsof -p pid

load

io

磁盘

  • df -h
  • du -h

gc

  • jps
  • jps -l
  • jps -lv工具

  • jinfo -flags pidoop

  • jstat -gcutil pid 1s

  • jstat -gccause pid 1s
  • 查看gc.log

  • jstack -l

  • 查看某个进行内占用cpu最多的进程 
    top -Hp pid 
    找到后,转换成16进行 printf ‘%x\n’ pid,如printf ‘%x\n’ 8241 获得2031 
    再在jstack 结果中查找这个线程号对应的线程是什么
  • jstack -l 中查看是否有死锁 #TODO

  • jmap -histor pid

  • jmap -histo:live pid
  • jmap -histo:live pid | less
  • jmap -heap pid
  • dump 内存文件 jmap -dump:format=b,file=dump.bin,live 8176

tcp

  • ifconfig查看有哪些网卡和相应的参数,ip,mtu等
  • netstat 类 TODO
  • 有root权限时,能够执行tcpdump 
    tcpdump -i eth0 tcp port 8888
  • 查看TCP参数 
    less /etc/sysctl.conf

查看多台机器的工具

  • polysh

代码类

抛异常

编写代码时要在关键的位置 
* 调用外部服务、远程方式的参数、结果上打印log 
* 一些关键的步骤,打印参数等 
* 异常处理的地方,打印参数,异常栈 
这样就能够在程序抛出异常的时候,经过异常栈以及咱们打印的参数快速的判断是哪里出现了问题。

防护式编程

  • 不要对外来的参数作假设,不要假设外部参数不是null或者其中任意一个属性不是null,都要进行判断,能够 
    经过Preconditions类或StringUtils.isNotEmptyCollectionUtils.isNotEmpty等进行 
    防护
  • 在循环处理的地方,若是但愿其中一个循环出错不影响其余循环的执行时,要在循环内部catch
for (e in loop) {
    try {
        do loop
    } catch (Exception e) {
        log and exception handle
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 防护式拷贝 
    Defensive copy. 当一个方法返回一个对象时,咱们要考虑外部调用方可能会修改这个对象的值,致使其余引用这个对象的地方 
    观察到状态改变。这种隐含的变化可能带来bug。经过defensive copy,返回一个新的对象,避免了共享对象。可是要注意的是, 
    copy也有深度copy和浅copy。另外一种方式是返回一个不可修改的集合,如Collections.unmodifiableCollection等。

启动类

java启动报错

常常出现的状况是,在本地开发没有问题、或是在staging测试也没问题,部署到线上启动就报错了。 
这个时候仍是须要在编写代码时就提早注意,有哪些用到了依赖于环境的地方 
如 
* 服务依赖,各个环境的服务配置、服务是否存在 
* 端口,是否和已有的程序的端口冲突了 
* 权限,写文件或者日志目录是否有权限

另外还有maven引用jar包冲突的,会出现NoSuchMethodError等错误 
这个时候,找到哪一个类的版本不一致,在代码中找到对应的依赖的jar包 
经过mvn dependency:tree | grep 进行查看有哪些地方引入了jar包  maven 采用的是按照声明顺序靠前的使用。  当能够进行必定的调试时,只在staging环境或者有一个jsp页面能够调用java代码,  可使用Class.forName(“xxx”).getClassLoader XXX.class.getResource(“xxx.yy.ZZZ”)来查看用的是那个地方的class文件  也能够解压jar包,使用javap -v -p -c 查看class文件内容  另外还有一些工具,像BTrace、housemd、greys来帮助咱们线上调试

相关文章
相关标签/搜索