生产环境服务器变慢,诊断思路和性能评估
内存溢出OOM可能的原因
- 内存中加载大量数据(如一次性数据库读取的数据过多)
- 集合类中对对象的引用,JVM无法回收(全局静态MAP)
- 死循环产生过多重复对象
- 第三方软件bug
- 连接数据库,IO流等长时间开启不关闭
- 监听器的使用,在释放时没有删除监听器
CPU100%
- 由于内存溢出,导致不断GC,GC overhead,导致cpu100%
- 死循环,递归调用,如hashmap被多线程并发调用
- 某些特定的cpu操作被长时间执行
- sql查询过慢等
问题排查
1.top 查看进程的cpu 内存的占用
系统的平均负载,如果撒(1.35+0.81+0.37)/3>0.6 表示系统负载过高
2.uptime (top的精简版)
3.vmstat -n 2 3 没两秒采样一次,共计采样3次,r : 3+1+2 超过了2*3
查看所有cpu core 信息 mpstat -P ALL 2 每2秒采样一次
内存:free -m
pid -p 进程号 -r 采样间隔秒
磁盘 :df 查看磁盘剩余空间
磁盘IO iostat-xdk 2 3
网络IO ifstat
cpu占用过高定位
top 命令查出java cpu过高的进程号
ps -ef|grep java|grep -v grep
ps -mp 进程号 -o THREAD,tid,time
将线程Id 转为16进制的tid
jstack pid |grep tid -A60 打印前60行
jstack pid > /tmp/log.txt 输出到文件查看
增加 -XX:+HeapDumpOnOutofMemoryError参数
-XX:+HeapDumpPath ,OOM时会在/opt/soft/heap/heapdump/ 下申城java_pid$pid.hprof 二进制文件
#用法: jmap ‐dump:format=b,file=dumpFileName名字 <pid进程号> #示例 jmap ‐dump:format=b,file=/opt/soft/heap/heapdump/dump.dat 11927
使用工具分析此文件
性能监测工具使用