一、问题背景
环境:jdk1.8 + tomcat7
在一次发布时,cpu
出现负载过高,其负载突破200%
,并且响应时间也大幅度超时。
二、问题分析
【1】发布前做过压测,并没有发现cpu
异常升高的现象,所以其可能与生产环境的请求相关。
【2】通过cat
观察thread dump
虽然发现http
线程数有所增加,并且存在block
线程数,但是观察锁竞争详情,发现其均是框架代码正常的锁竞争,比如序列化获取时间需要拿到format
对象锁,另外也对排除dead lock
的可能。
【3】由于测试环境无法复现,所以尝试使用镜像机器,并在惊喜机器中复现cpu
上升的问题,由于设计到cpu load
的问题,选择使用性能实验室中的cpu 火焰图,观察cpu
热点代码。
【4】通过观察火焰图,发现String::equalsIgnoreCase
方法位于顶层,且宽度想对较大,也就是说工具在采样cpu
执行的代码时,很大一部分都采样到该函数,说明cpu
的资源集中在这个函数上。
纵轴表示栈帧深度,横轴表示代码占用CPU/内存的比例,点击可以查看