✅服务器有多个节点,线上出现用户进入缓慢,监控服务器cpu和缓存没有什么压力,可以从哪些方面排查?
典型回答
这个问题,有几个关键信息需要提取出来:
多个节点、缓慢、CPU和缓存无压力。
首先,要确定的是这个问题是个例,还是普遍情况,如果只是个例,那么有可能是用户的网络、浏览器等问题,我们之前就出现过类似的情况,用户自己开了梯子,然后你懂得。。。还有的是用户自己加了一些特殊的绑定(这个通常出现在开发或者测试自己的机器上)
排除了个人问题之后。接着分析。
首先我们看问题是什么,问题是用户访问慢,如何排查。用户访问慢那就是RT长(Response Time),那么用户的一次请求的响应时间中,包含了网络连接的时长、网路传输的时长以及服务处理的时长。
在CPU和缓存都没有压力的情况下,请求的RT还是长,那么首先考虑的方向就是网络上面的耗时,有以下几种可能:
- 带宽限制或网络拥塞:这种情况可以检查下服务器的出入带宽是否达到了上限,或者是否存在网络拥塞情况。
- 网络延迟或丢包:如果网络出现了延迟,或者丢包的情况,也会导致访问速度变慢。使用网络工具(如
ping或traceroute)检查服务器与用户之间的延迟,看看是否存在网络中断或者数据包丢失。 - CDN 问题:如果使用了 CDN,也有可能是 CDN 的某个节点有问题,导致用户无法正常加载资源。
接下来,问题中提到有多个节点(你记住,面试官再给你出问题的时候,题眼中的很多关键字,都是很重要的)。
多个节点,这是面试官主动提的,那么说明他肯定有些想问的东西埋在了里面,这里其实想问的就包含了负载均衡。因为多个节点,就需要涉及到如何在多个节点之间选择一个节点来处理请求了。
所以我们也需要检查负载均衡配置是否正确,有没有将请求分配到不健康的节点上。
接下来,就是应用本身的一些问题(其实,实际我们应该首先考虑应用问题,都排除了之后在考虑负载均衡和网络问题)。
首先就是有可能有一次时间比较长的GC。这个大家都比较容易理解。
应用的CPU虽然不高,但是如果应用频繁读写磁盘数据,有大量的I/O操作,也可能会导致响应慢,所以我们需要检查磁盘的 I/O 是否存在大量读写以及瓶颈。 比如说有大量的日志写入,这是个很常见的一个问题,有些应用的瓶颈都卡在了日志写入上。
其次,除了文件的I/O外,还有一些网络层面的,比如你这里需要调外部接口,而外部接口响应很慢,一直等他返回,这时候也会导致请求的RT变长,但是CPU和缓存没有啥异常。
最后,还有一个值得考虑的,那就是数据库的性能,如果存在一些慢SQL,数据库连接数不够,以及锁阻塞等问题,也会导致请求很慢,这时候就要结合数据库的监控来排查这个问题。
扩展知识
排查路径
如果这个问题,是我遇到了,我会这么排查(我司监控比较完善,所以排查问题还是比较容易的)
1、查看监控,是否存在误报。看异常是否还在持续。
2、查看当前是否正在发布,是否和发布有关,进一步确认是否代码问题,或者未预热导致。
✅应用启动后前几分钟,Load、RT、CPU等飙高,如何定位,可能的原因是什么?
3、通过机房、分组等对比看下异常是全局的还是部分的。进一步定位到具体的影响范围。
4、同时查看当前时刻的QPS是否有明显增加,是否和流量上涨有关,如果是流量突增,先扩容。
5、查看当前时刻是否有频繁的GC,尤其是FullGC,以及GC的时长。
6、同时找到具体的RT变长的服务(我们针对每一个RPC接口都有详细的RT的监控)以及下游依的服务。
7、看下游服务是否有大量的超时或者失败的情况,如果是,直接call人。
8、查看底层依赖,比如Redis、MySQL等的是否有慢查询的异常情况,如果有,进一步看原因。
9、如果以上都没有,查看这台虚拟机所在的宿主机的情况,是否有大量的网络重传等问题。