记一次CPU百分百的问题

服务拆分迁移,但是拆分后的子服务,会有一台机器CPU 飙100%,持续一下就没了。

背景

一个定时任务服务,由于定时任务属于边缘业务,各业务线发展拆分时,一直没有动这个服务。 最近这个服务改动太过频繁,太多业务在一个服务上,今天这个上线,明天那个上线。

那就拆吧,各个业务线自己拎走自己的业务。

其中一个2B 业务线的定时任务,在拆分后,会有一台服务器CPU 飙100%。

问题表象

一个凌晨的定时任务,会对所有企业客户做一次一天内的数据统计。

然后这个任务在执行时,就会有 CPU 飙100%。

问题排查

一) 查监控

查了下监控,在 CPU 飙高时,是 java 线程飙起来的。

此时没有 YGC 和 FGC。没有系统异常。

排队服务问题

二)看代码

任务流程比较长,长期打补丁的操作,使任务的性能比较低。

都是一些比较频繁的计算动作。典型的 CPU 密集型服务。

更要命的是,任务中有多处递归调用。还有几处的嵌套递归调用。

这玩意,CPU 不高才怪。

三)为啥没拆之前没会飙高呢?

没拆之前,各业务线在同一上服务上,服务扩容最后有10台服务器。拆分后这个业务上只拿到2台服务器。

线上数百家的企业客户,由10台变2台。处理是有点费劲。

问题一下子明了了。

根本问题

一)代码写的不好 ,很需要优化。但逻辑又臭又长,一时没人下得了手。

二)由10台服务器一下子降到2台。任务略有压力

解决

好在是定时任务,没有时效要求。

当前服务器 CPU 是 4 核 4 线程。任务线程池的线程数降到2 。

2个线程打爆了也只占50% 。

任务时间由原来的20分钟,延长到了2小时。

根本解决

还得从代码上根本解决,任务拆分,结构化计算逻辑。

去掉递归调用。

服务器压力还是有的 。后面还抗不往就得加机器了。

总结

历史包袱啊。。。 唉!只能说每个人尽量自觉些,写代码用点心。

posted @ 2020-04-15 21:46  孙行者、  阅读(239)  评论(0编辑  收藏  举报