近来服务器一直会有一些突发的负载高峰,而且还很有规律性,每十分钟一个高峰,同时可以看到TCP连接数和网络也会迎来高峰。
首先怀疑是外部流量所致,开始有几次逮到百度爬虫正在爬取,以为是百度周期性爬取。
后来发现百度没在爬的时候依然有此现象,怀疑是服务器上的定时任务积攒所致,因为有许多整5分钟,整10分钟的任务,这样就导致每个整十分钟会集中执行一大批任务,遂调整任务周期,把任务酌情改为不能被5和10整除的周期。依然没效果,回到监控图表看,负载应该来自网络请求,这样虽有优化,但是应该影响有限。为了更准确的定位,我把接口的请求全部发往一台机,web请求全部发往一台机,这样有助于缩小破案范围。
最后,还是在日志里面找答案。经过查看负载均衡的日志,发现访问量并没有10分钟的周期性爆发,确认日志无误之后分析,应该是某个访问会周期性的计算量大增,很可能是某高频接口的缓存是十分钟过期,十分钟之后需要重新计算,所以计算量大增,如果在下次缓存生成之前有许多访问进来都会被阻塞,所以这些访问都会重新计算和写缓存,同时TCP连接并没有被释放,看起来产生一种并发量大增的假象。完全符合症状,开始排查各种缓存接口,倒是非常的可惜,竟然所有接口的缓存都没有十分钟过期的。
继续查日志,又有了新的发现,虽然我服务器只运行了接口,但是web的日志也在不停的增长,而且每秒都有十几访问,打开查看全部是访问首页,而且是HEAD请求,IP是阿里云内网。再看首页,缓存正好是十分钟,虽然是HEAD请求,但对后端来说是一样执行的。为了验证它的影响度,我把缓存时间做了调整,果然发现高峰的周期也跟着发生了变化。至此可以宣告锁定了罪魁祸首就是这批HEAD请求。
那么这批HEAD请求是什么来历呢,阿里云工单反馈是来自负载均衡的健康检查,关闭了健康检查之后果然没有了,服务器整体性能又提高一大截,实在是又惊又喜。
但是想想为什么HTTP的健康检查会跑到web首页呢,我又没有指定他如何做健康检查,其实原因就在web站点的nginx设置了default_server。任何80端口的http访问,如果没有指定域名,都会跑到web站对应的配置,所以就是web首页咯。所以默认服务器的配置非常重要,尤其对于开了健康检查的情况,最好设置到一个静态页面或无须过多计算的页面。