一次k8s容器云上某个服务cpu使用异常问题定位

问题简介

我们项目运行在k8s集群中,在运行期间出现存在一个服务的cpu使用比较异常相对其他服务的cpu使用要远远要高

一次k8s容器云上某个服务cpu使用异常问题定位_第1张图片

 

 

问题定位及分析

通过容器外部执行top -Hp pid命令查看异常服务进程的线程使用情况

一次k8s容器云上某个服务cpu使用异常问题定位_第2张图片

上面为找到明显的性能消耗线程,但是却总有10左右的线程消耗cpu比较多,跟踪其中占用为11.8的系统调用情况如下

一次k8s容器云上某个服务cpu使用异常问题定位_第3张图片

上面执行大量重复的唤醒和阻塞操作

 

进入到k8s容器中安装Htop  apk add Htop

然后再执行Htop 查看线程上面的cpu消耗再结合jstack 里面的线程id

最终定位到如下调用存在问题疑点

一次k8s容器云上某个服务cpu使用异常问题定位_第4张图片

查看下业务人代码调用:

一次k8s容器云上某个服务cpu使用异常问题定位_第5张图片

通过分析代码:

当kafkaQueue中阻塞队列为空时会存在大量频繁的调用isEmpty方法,而isEmpty方法中是通过lock.lock()和lock.unLock()来保证线程安全的。从而会出现上面大量挂起及唤醒的操作

 

优化建议

 

取消isEmpty判断,使用阻塞队列中的take方法,其本身就能做到没有数据时会阻塞,有数据时才会唤醒

你可能感兴趣的:(随笔录)