✅服务器有多个节点,线上出现用户进入缓慢,监控服务器cpu和缓存没有什么压力,可以从哪些方面排查?

✅服务器有多个节点,线上出现用户进入缓慢,监控服务器cpu和缓存没有什么压力,可以从哪些方面排查?

典型回答

这个问题,有几个关键信息需要提取出来:

多个节点缓慢CPU和缓存无压力

首先,要确定的是这个问题是个例,还是普遍情况,如果只是个例,那么有可能是用户的网络、浏览器等问题,我们之前就出现过类似的情况,用户自己开了梯子,然后你懂得。。。还有的是用户自己加了一些特殊的绑定(这个通常出现在开发或者测试自己的机器上)

排除了个人问题之后。接着分析。

首先我们看问题是什么,问题是用户访问慢,如何排查。用户访问慢那就是RT长(Response Time),那么用户的一次请求的响应时间中,包含了网络连接的时长、网路传输的时长以及服务处理的时长。

在CPU和缓存都没有压力的情况下,请求的RT还是长,那么首先考虑的方向就是网络上面的耗时,有以下几种可能:

  • 带宽限制或网络拥塞:这种情况可以检查下服务器的出入带宽是否达到了上限,或者是否存在网络拥塞情况。
  • 网络延迟或丢包:如果网络出现了延迟,或者丢包的情况,也会导致访问速度变慢。使用网络工具(如 pingtraceroute)检查服务器与用户之间的延迟,看看是否存在网络中断或者数据包丢失。
  • CDN 问题:如果使用了 CDN,也有可能是 CDN 的某个节点有问题,导致用户无法正常加载资源。

接下来,问题中提到有多个节点(你记住,面试官再给你出问题的时候,题眼中的很多关键字,都是很重要的)。

多个节点,这是面试官主动提的,那么说明他肯定有些想问的东西埋在了里面,这里其实想问的就包含了负载均衡。因为多个节点,就需要涉及到如何在多个节点之间选择一个节点来处理请求了。

所以我们也需要检查负载均衡配置是否正确,有没有将请求分配到不健康的节点上。

接下来,就是应用本身的一些问题(其实,实际我们应该首先考虑应用问题,都排除了之后在考虑负载均衡和网络问题)。

首先就是有可能有一次时间比较长的GC。这个大家都比较容易理解。

应用的CPU虽然不高,但是如果应用频繁读写磁盘数据,有大量的I/O操作,也可能会导致响应慢,所以我们需要检查磁盘的 I/O 是否存在大量读写以及瓶颈。 比如说有大量的日志写入,这是个很常见的一个问题,有些应用的瓶颈都卡在了日志写入上。

✅项目中,如果日志打印成为瓶颈,该如何优化?

其次,除了文件的I/O外,还有一些网络层面的,比如你这里需要调外部接口,而外部接口响应很慢,一直等他返回,这时候也会导致请求的RT变长,但是CPU和缓存没有啥异常。

最后,还有一个值得考虑的,那就是数据库的性能,如果存在一些慢SQL,数据库连接数不够,以及锁阻塞等问题,也会导致请求很慢,这时候就要结合数据库的监控来排查这个问题。

扩展知识

排查路径

如果这个问题,是我遇到了,我会这么排查(我司监控比较完善,所以排查问题还是比较容易的)

1、查看监控,是否存在误报。看异常是否还在持续。

2、查看当前是否正在发布,是否和发布有关,进一步确认是否代码问题,或者未预热导致。

✅应用启动后前几分钟,Load、RT、CPU等飙高,如何定位,可能的原因是什么?

3、通过机房、分组等对比看下异常是全局的还是部分的。进一步定位到具体的影响范围。

4、同时查看当前时刻的QPS是否有明显增加,是否和流量上涨有关,如果是流量突增,先扩容。

✅什么是QPS,什么是RT?

5、查看当前时刻是否有频繁的GC,尤其是FullGC,以及GC的时长。

✅4C8G的机器,各项系统指标,什么范围算是正常?

6、同时找到具体的RT变长的服务(我们针对每一个RPC接口都有详细的RT的监控)以及下游依的服务。

7、看下游服务是否有大量的超时或者失败的情况,如果是,直接call人。

8、查看底层依赖,比如Redis、MySQL等的是否有慢查询的异常情况,如果有,进一步看原因。

9、如果以上都没有,查看这台虚拟机所在的宿主机的情况,是否有大量的网络重传等问题。

✅什么是TCP重传率,有什么用?如何查看?