定位接口慢——原因

第一步,检查网络

ping命令检查网络域名解析是否正常,ping服务器的延迟是否过大,如果过大可以检查Ip是否冲突,或者交换机网线是否正常插好,通过nmon还可以查看网络流量,一般用的千兆交换机理论速率是1000/8=125MB每秒,但是这理论峰值一般都无法达到,所以如果网络流量达到了80~100MB每秒则可以判定瓶颈在交换机上,也可以用telnet来查看端口访问是否正常。通过这些方式,首先排除网络可能出现的问题,如果网络没有问题,那就开始第二步

第二步,检查服务器内存

如果请求响应速度慢,一般跟内存关联比较大,通过free -m, vmstat 1,nmon工具等方式判断内存资源是否紧缺,如果内存资源不存在问题,进入第三部

第三步,查看CPU负载

可以通过sar、vmstat、top、nmon等工具或命令判断cpu是否过载,如果没有问题那就进行第四步

第四步,检查磁盘IO

可以通过iostat 1、vmstat 、nmon等命令检查磁盘的读写,如果没有问题,linux系统自身的性能问题基本排除

第五步,抓取进程堆栈信息

通过jstack -l pid | tee -a out.log 将pid的堆栈信息抓取出来,放到out.log的文件中分析,看是在java进程的哪一步耗时较大,然后针对那部分代码进行优化

 

常见的有:

 

SQL 会是性能瓶颈,主要原因是没有命中索引。

发送远程数据请求(RPC 远程调用、HTTP 远程调用)。

I/O 操作等。

最常见的是在循环中执行 SQL或者网络请求。

 

然后审查一下自己的代码发现 SQL 查询部分都可以命中索引,调用链路上有一个函数最终会调用 HTTP 请求,而且是在一个循环里。

 

因此最有可能成为造成接口延时的是底层依赖的 HTTP 请求。

 

2.2 解决

既然 HTTP 请求是性能瓶颈,那么要尽量减少请求,或者让请求由串行改为多线程并发/并行。

 

减少网络请求的次数,可以将多个请求合并成一个批量接口(或者增加批量请求的每个批次的大小)。

 

这里的批次甚至可以使用动态配置,根据情况动态修改。

 

将串行改为并行可以使用 CompletableFuture 来实现,具体参见:《Java 数据分批调用接口的正确姿势》

 

 

转载于:https://my.oschina.net/u/2499632/blog/704765

posted on 2021-06-28 17:07  小鸡的  阅读(551)  评论(0)    收藏  举报

Live2D