线上排查cpu高

查消耗cpu最高的进程PID

  1. top -c
  2. 按P,进程按照cpu使用率排序

根据PID查出消耗cpu最高的线程号

  1. top -Hp 进程号
  2. 按P,进程按照cpu使用率排序
  3. 将最高的十进制线程号转为十六进制

根据线程号查出对应的java线程,进行处理

  1. jstack -l pid > pid.test
  2. cat pid.test | grep ‘十六进制线程号’ -C 8 或者直接less进去看

TIM截图20190503131026

可以看出,如果想要提高性能,可以从SimpleDateFormat性能上入手,换成DateTimeFormatter。

使用arthas和jstat与jmap

https://alibaba.github.io/arthas/quick-start.html

案例1

image

image

从上面可以看到大部分都在内存几乎都满了,通过jstat或者arthas都可以看到。通过jmap看到大部分的内存集中在字符,应该是序列化和逆序列化堵了,而且线程结果可以看到,多次采样,在SimpleDateFormat上性能消耗很多。

将SimpleDateFormat换成FastDateFormat.本地测试,后者性能比前者高一倍。

其次,调整jstorm内部的资源分配,不是一味的增加资源就能解决问题,资源分配对内存的分配至关重要。

案例2

image

很明显可以看到,这个Channel类,在内存中不下百万个实例,频繁的gc会导致程序性能不行。

内存dump

导出整个JVM 中内存信息

1
jmap -dump:format=b,file=文件名 [pid]

通过mat分析堆栈信息。