Waiting for server respnse耗时过长原因排查及解决

 更新时间:2023年05月24日 09:03:00   作者:iiopsd  
这篇文章主要给大家介绍了关于Waiting for server respnse耗时过长原因排查及解决的相关资料,文中将解决的办法介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

背景

开发了一个导入接口,测试过程中发现导入压缩包24M时,耗时50多秒。觉得这个时间太长了,可能存在问题,于是开始了漫长的排查之旅。

查看接口时间

通过Chrome DevTools 查看接口请求信息,发现接口时间主要消耗在发送数据(Request sent)和等待服务器响应(Waiting for server respnse)两部分。

Request sent:平均在31s

Waiting for server respnse:平均18s

Request sent时间属于正常偏慢,因为发送数据受网络上行带宽限制,暂时也没办法做太大的优化。
Waiting for server respnse时间有很大的问题,因为接口中只做了简单的操作,复杂的数据处理都是异步执行的,所以问题应该在服务端。

排查接口问题

怀疑是接口请求问题后,就使用arthas trace 查看接口详细耗时。

docker exec -it xxx java -jar /arthas/arthas-boot.jar
[INFO] arthas-boot version: 3.5.1
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 10 org.springframework.boot.loader.JarLauncher

[INFO] arthas home: /opt/arthas
[INFO] Try to attach process 10
[INFO] Attach process 10 success.
[INFO] arthas-client connect 127.0.0.1 3658
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.                           
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'                          
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.                          
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |                         
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'                          
                                                                                

wiki       https://arthas.aliyun.com/doc                                        
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html                  
version    3.5.1                                                                
main_class                                                                      
pid        10                                                                   
time       2022-11-23 19:07:06                                                  

[arthas@10]$ trace xxx.XXXController test  -n 5 --skipJDKMethod false 
Press Q or Ctrl+C to abort.
Affect(class count: 2 , method count: 2) cost in 601 ms, listenerId: 1
`---ts=2022-11-24 13:44:28;thread_name=http-nio-9001-exec-17;id=bd;is_daemon=true;priority=5;TCCL=org.xxx.xxxClassLoader@300aa927
    `---[211.492528ms] xxx.XXXController$$EnhancerBySpringCGLIB$$103cd3e4:test()
        `---[166.654272ms] org.xxx.MethodInterceptor:intercept() #57
            `---[102.043649ms] com.xxx.XXXController:test()
                +---[101.125313ms] com.xxx.XXXService:importUser() #359
                `---[0.754306ms] com.xxx.XXXBuilder:success() #57

根据arthas trace日志显示,接口耗时在200ms左右,这才是符合预期的时间。没有找到具体问题,只能代码走查一遍。接口逻辑其实很清晰,先校验文件格式大小,然后创建异步任务(插入一条数据),最后执行异步任务。因为有异步任务,所以整个接口耗时应该最多几百毫秒,初步判断arthas trace的结果正确合理。

排查网关问题

既然接口实现没有问题,那就往上游排查,查看网关是否存在问题。查看网关接口请求和返回时间和刚才arthas trace时间相差无几,排除了网关的问题。

排查SLB问题

网关没问题只能在往上排查问题,测试了另一个环境B发现是相对正常的,Waiting for server respnse 时间在600ms左右。

对比讨论了下两个环境的差异,发现有问题的环境A相比正常的环境B多了一层SLB负载均衡,怀疑可能是这个问题。网上查了相关资料,也没有显示SLB有出现过这种情况。

于是让运维先关闭SLB负载均衡验证一下情况,修改SLB配置后需要一小会才能生效,结果显示关掉SLB接口请求时间还是有问题, 因此也不是SLB的问题,于是只是剩下Nginx了。

排查Nginx问题

排查了一下午没有结果,然后就先去吃饭休息,踢踢桌面足球放松一下。

放松回来后,开始排查了Nginx配置,尝试重启ng,修改buffer大小都无济于事。扫到ng配置的时候发现ng做了一次负载均衡,而且服务器地址配置的是公网ip,猜测可能是这个问题,死马当成活马医,随便试试看。修改为内网地址,然后重启ng后验证发现正常了。就这样正常了。花了大半天时间,总算解决了。后来复盘讨论猜测,应该是ng接收到文件后,通过负载均衡走公网ip转了一圈回来导致Waiting for server respnse 耗时过长。

一不小心就有坑。

总结

到此这篇关于Waiting for server respnse耗时过长原因排查及解决的文章就介绍到这了,更多相关Waiting for server respnse耗时过长内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Nginx 502 Bad Gateway错误常见的4种原因和解决方法

    Nginx 502 Bad Gateway错误常见的4种原因和解决方法

    这篇文章主要介绍了Nginx 502 Bad Gateway错误常见的4种原因和解决方法,本文适用FastCGI环境,其中多数原因通过配置相关参数即可解决,需要的朋友可以参考下
    2015-05-05
  • 前端必备的一些nginx知识点汇总

    前端必备的一些nginx知识点汇总

    Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,下面这篇文章主要给大家汇总介绍了关于前端必备的一些nginx知识点,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • Nginx服务器作反向代理实现内部局域网的url转发配置

    Nginx服务器作反向代理实现内部局域网的url转发配置

    这篇文章主要介绍了Nginx服务器作反向代理实现内部局域网的url转发实例,文中提到需要注意proxy_read_timeout参数的相关调整,需要的朋友可以参考下
    2016-01-01
  • 使用Nginx实现负载均衡的策略

    使用Nginx实现负载均衡的策略

    本篇文章主要介绍了使用Nginx实现负载均衡的策略,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Nginx一个域名访问多个项目的方法实例

    Nginx一个域名访问多个项目的方法实例

    这篇文章主要给大家介绍了关于Nginx一个域名访问多个项目的方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Nginx具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • Nginx安装配置详解

    Nginx安装配置详解

    Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。本文详细讲解了Nginx安装与配置的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • nginx缓存及错误页面配置

    nginx缓存及错误页面配置

    这篇文章主要介绍了nginx缓存及错误页面配置的相关资料,需要的朋友可以参考下
    2017-01-01
  • nginx日志配置指令详解

    nginx日志配置指令详解

    这篇文章主要介绍了nginx日志配置指令详解,nginx有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志,需要的朋友可以参考下
    2014-07-07
  • nginx配置keepalive长连接的实现方法

    nginx配置keepalive长连接的实现方法

    长连接允许客户端在同一个TCP连接上发送多个请求,以减少连接握手的开销,提高网站性能,本文主要介绍了nginx配置keepalive长连接的实现方法,感兴趣的可以了解一下
    2023-08-08
  • nginx 隐藏版本号与WEB服务器信息的解决方法

    nginx 隐藏版本号与WEB服务器信息的解决方法

    这篇文章主要介绍了nginx 隐藏版本号与WEB服务器信息的解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11

最新评论