实际项目中如何进行问题排查

Linux自带

  1. 文本操作
    1. 文本查找 - grep
    2. 文本分析 - awk
    3. 文本处理 - sed
  2. 文件操作
    1. 文件监听 - tail
    2. 文件查找 - find
  3. 网络和进程
    1. 网络接口 - ifconfig
    2. 防火墙 - iptables -L
    3. 路由表 - route -n
    4. netstat
  4. 其他常用
    1. 进程 ps -ef | grep java
    2. 分区大小 df -h
    3. 内存 free -m
    4. 硬盘大小 fdisk -l | grep Disk
    5. top
    6. 环境变量 env

JDK自带

  1. jsp:jdk提供的查看java进程的工具
    jps –l # 输出输出完全的包名,应用主类名,jar的完全路径名 
    
  2. jstack:jdk自带的线程堆栈分析工具,使用该命令可以查看或导出java 应用程序中线程堆栈信息
    # 基本
    jstack 2815
    jstack -m 2815 # java和native c/c++框架的所有栈信息
    jstack -l 2815 # 额外的锁信息列表,查看是否死锁
  3. jinfo: JDK 自带的命令,可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息
  4. jstat jstat参数众多,但是使用一个就够了
  5. jstat -gcutil 2815 1000 
    
    # 如何使用在线调试工具Arthas?

    举几个例子

  6. 查看最繁忙的线程,以及是否有阻塞情况发生?
  7. 场景:我想看下查看最繁忙的线程,以及是否有阻塞情况发生? 常规查看线程,一般我们可以通过 top 等系统命令进行查看,但是那毕竟要很多个步骤,很麻烦。

    thread -n 3 # 查看最繁忙的三个线程栈信息
    thread  # 以直观的方式展现所有的线程情况
    thread -b #找出当前阻塞其他线程的线程
    
  8. 确认某个类是否已被系统加载?
  9. 场景:我新写了一个类或者一个方法,我想知道新写的代码是否被部署了?

    # 即可以找到需要的类全路径,如果存在的话
    sc *MyServlet
    
    # 查看这个某个类所有的方法
    sm pdai.tech.servlet.TestMyServlet *
    
    # 查看某个方法的信息,如果存在的话
    sm pdai.tech.servlet.TestMyServlet testMethod  
    
  10. 如何查看一个class类的源码信息?
  11. 场景:我新修改的内容在方法内部,而上一个步骤只能看到方法,这时候可以反编译看下源码

    # 直接反编译出java 源代码,包含一此额外信息的
    jad pdai.tech.servlet.TestMyServlet
    
  12. 如何跟踪某个方法的返回值、入参?
  13. 场景:我想看下我新加的方法在线运行的参数和返回值?

    # 同时监控入参,返回值,及异常
    watch pdai.tech.servlet.TestMyServlet testMethod "{params, returnObj, throwExp}" -e -x 2 
    
  14. 如何看方法调用栈的信息?
  15. 场景:我想看下某个方法的调用栈的信息?

    stack pdai.tech.servlet.TestMyServlet testMethod
    

    运行此命令之后需要即时触发方法才会有响应的信息打印在控制台上

  16. 找到最耗时的方法调用?
  17. 场景:testMethod这个方法入口响应很慢,如何找到最耗时的子调用?

    # 执行的时候每个子调用的运行时长,可以找到最耗时的子调用。
    stack pdai.tech.servlet.TestMyServlet testMethod
    

    运行此命令之后需要即时触发方法才会有响应的信息打印在控制台上,然后一层一层看子调用。

  18. 如何临时更改代码运行?
  19. 场景:我找到了问题所在,能否线上直接修改测试,而不需要在本地改了代码后,重新打包部署,然后重启观察效果?

    # 先反编译出class源码
    jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java  
    
    # 然后使用外部工具编辑内容
    mc /tmp/UserController.java -d /tmp  # 再编译成class
    
    # 最后,重新载入定义的类,就可以实时验证你的猜测了
    redefine /tmp/com/example/demo/arthas/user/UserController.class
    

    如上,是直接更改线上代码的方式,但是一般好像是编译不成功的。所以,最好是本地ide编译成 class文件后,再上传替换为好!

    总之,已经完全不用重启和发布了!这个功能真的很方便,比起重启带来的代价,真的是不可比的。比如,重启时可能导致负载重分配,选主等等问题,就不是你能控制的了。

  20. 我如何测试某个方法的性能问题?

实际项目中如何进行问题排查_第1张图片

  1. monitor -c 5 demo.MathGame primeFactors

你可能感兴趣的:(问题排查,java,linux)