排查业务问题

  1. 采用tail -fn 200 log_file 实时查询线上日志
  2. 找准日志搜索关键字 keyWord,例如 orderid、mobileId、reqId 等
  3. 采用grep keyWord log_file查询关键字所在行的日志
  4. 采用 grep -C n keyWord log_file匹配关键字所在行的上下 n 行
  5. 采用grep keyWord log_file | wc -l匹配关键字的行数有多少
  6. 根据实际排查日志场景进行搜索 tail、grep 用的最多

线上应用 CPU 占用过高

  1. 采用top命令,找出 CPU 占用最高的 PID
  2. 通过ps -ef | grep PID查看对应的应用
  3. 采用jstack -l PID >> PID.log获取进程额堆栈信息
  4. 采用ps -mp PID -o THREAD,tid,time拿到占用 CPU 最高的 tid
  5. 采用printf “%x\n” tid获取 16 进制的线程 TID
  6. 采用grep TID -A20 PID.log确定是线程哪里除了问题
  7. 腿疼医腿,辩证施治,对症下药,找准代码位置,进行调整代码

线上应用内存溢出

  1. 采用top命令,找出对应的 PID

  2. 采用jmap -heap PID确认一下分配的内存少不少

  3. 采用jmap -histo:live PID | more找出分析最耗内存的对象

  4. 采用ps -efL | grep PID | wc -l查看进程创建的线程数

  5. 采用ls -l /proc/PID/task | wc -l也可以查看进程创建的线程数

  6. 采用netstat -apn | grep 4532 | wc -l查看进程网络连接数

  7. 腿疼医腿,辩证施治,对症下药

    a. 内存分配确实小,适当调整内存;

    b. 对象被频繁创建,且不释放,优化代码;

    c. 不断创建线程或者不断进行网络连接,优化代码。

工具

JDK 自带工具

命令 说明
jps 查看 java 进程概述
jconsole 图形化查看内存线程 VM 参数等信息
jstat 查看内存使用状况
jstack 分析线程
jmap 查看内存信息或 dump 下内存详情
jvisualvm 图形化工具,功能在 jconsole 之上

第三方工具

Arthas,官网 https://arthas.aliyun.com,功能强大,常用命令:

命令 说明
dump 将已加载的字节码文件保存到特定的目录中
classloader 获取类加载器的信息
monitor 监控指定类种方法的执行情况
watch 观察指定方法的调用情况
trace 对方法内部调用路径进行追踪,并输出方法路径上每个节点上耗时
stack 输出当前方法被调用的路径
tt 记录指定方法每次调用的入参和返回的信息
options 全局开关
profiler 生成火焰图

性能问题排查思路

  1. 设计调优:一个良好的系统设计可以规避很多钱在的性能问题。必须熟悉常用的软件设计方法、设计模式、基本性能组件和常用优化思想。
  2. 代码调优:掌握编码技巧、对算法、数据结构的灵活使用。
  3. JVM 调优:JVM 的各项参数会直接影响 Java 程序的性能。
  4. 数据库调优:在应用层对 SQL 语句进行优化;对数据库进行优化。
  5. 操作系统调优:操作系统的性能对应用系统也有较大影响。
  6. 腿疼医腿,辩证施治,对症下药。