一个奇怪的node进程CPU上升问题

起因

由于春节期间项目有一个引流活动,后台目前的设计容量已经接近上限,需要对后台进行扩容。扩容过程中发现了一个奇怪的问题,扩容机器搭建好环境后,没有任何请求转发过来,但是每隔一分钟,对外服务进程CPU就会突然出现一个毛刺(8%),而查看进程日志,啥也没打印,感觉就像见了鬼了~

分析

一开始是猜测,是定时进程通知对外服务进程执行了定时任务,然而关掉定时进程,对外服务进程依然有毛刺;是node(我们后台使用的node)连接redis或者mysql的组件有什么保活机制,然后也没办法查。然后组里有一哥们推荐了一个node profiler组件,它的原理是定期采集node当前执行的函数,最后给出一个一段时间函数执行次数的排行榜,实在是个高级的东西,采集结果如下:

profiler采集结果

从上图可以看出,执行最多的是ccap模块中的一个函数,ccap是我们用来生成验证码的一个node模块,看了一下ccap的源码,才发现,这个模块的实现是每隔一分钟生成20个图片验证码缓存起来,然后用户获取验证码时从这20个中随机的返回1个,这下抓住鬼了,原来是验证码模块的定时任务导致

解决

这么看,抱着个模块放在对外服务进程中显然是不好的,会照成对外服务进程CPU毛刺,而且我们每台机器都有16个对外服务进程,这样验证码要缓存16*20份,每分钟更新16*20份,也没有必要,因此做了重构,把验证码单独拉出一个进程,起2个验证码进程,对外服务进程内部接口访问验证码进程获取验证码,这样降低了对外服务进程的CPU负载,同时也减少了整个验证码计算的浪费。

Loading Disqus comments...
Table of Contents