接口响应时常过长排查

1,067 阅读2分钟

CPU

原因

死循环、频繁GC、频繁切换上下文。

使用jstack来分析线程问题

  1. jps获取当前进程号;
  2. top pid 查看当前进程号的cpu使用率是否过高;
  3. 如果当前进程cpu过载,则可以
    1. 通过 top -Hp pid 查看当前进程下的所有线程的cpu使用情况;
    2. 获取到当前的线程pid之后需要将10进制专程16进制(printf"%x" pid);
    3. 通过jstack pid获取当前线程运行情况,并搜索指定线程,查看线程的状态和代码行数;
  4. 通过jstack查看是不是由于线程死锁导致的问题;
  5. cat jstack.log | grep "java.lang.Thread.State" | sort -nr | uniq -c 对整体线程的状态有个把控

GC问题

jstat -gcutil pid 查看ygc、fgc的时间和次数

频繁切换上下文

vmstat

磁盘

磁盘空间不足、io性能

  1. df -h 查看磁盘存储使用情况
  2. iostat -d -k -x 查看磁盘性能
  3. cat /proc/pid/io 查看具体进程的io情况
  4. ls -lah /proc/pid/fd查看此进程打开的文件
  5. lsof -p pid来看具体的文件io情况

内存

先通过free命令查看系统内存使用情况;

OOM java heap space

堆内存溢出,检查Xmx参数,获取dump文件分析 jmap -dump:format=b,file=filename pid,最好通过``````

OOM: stackOverFlowError unable to create new native thread

jstack查看线程数量,判断是否需要修改Xss

OOM metaspace

metaspace用于存储类信息、常量池、静态变量和即时编译的代码(如动态代理产生的),而且使用的不是虚拟机内存而是本地内存; 通过XX:MaxMetaspaceSize设置最大的元数据空间;通过XX:MaxPermSize设置非堆区分配的最大内存

stackOverFlowError 栈溢出

一般在递归中出现,深度过深

参考资料