叉乘:基于虚拟线圈法的车流量统计

页面导出为pnf文件

  返回  

记一次接口请求响应慢的问题定位思路

2021/7/20 16:20:45 浏览:

场景描述:
支付服务商(微信,支付宝)提供支付接口
支付平台提供了支付接口,调用支付服务商接口
app访问支付平台
急需解决方案翻到最后

现在从app访问下单接口最长需要10s,最短几十ms

  1. 首先排查接口哪一步慢
  2. 查app访问支付平台,ok
  3. 查服务器访问支付服务商接口,慢

从服务器访问服务商接口。偶尔ping不通。ping通很快。
接口没有出现连接不上的问题,网络不是核心问题
但日志上面显示时间确实需要5s

奇了怪了,开始不停的尝试,未果。

开始怀疑日志本身是不是出了问题

日志所有核心入口加时间记录,类似如下

		long start = System.currentTimeMillis();
    	Object result = client.execute(request);
    	long end = System.currentTimeMillis();
    	logger.info("时长为:{}毫秒",end - start);

好家伙,原来就是日志出了问题。。。

问题在哪?日志里面有个需要获取本地服务器的ip

InetAddress address = InetAddress.getLocalHost();

为啥很慢,研究了这个的源码,发现他最后既然用native 关键字去让系统自己给他处理了,真有你的哦
那代码层面就没辙了,那就看看系统是怎么查的。

突突突,进入服务器
hostname 查起来,抓到一个名字 暂定 为A
ip add 查起来网络配置

嗯?嗯?嗯?
A对应的ip哪去了???

执行 ping A 好家伙,等待等待等待。
Name or service not known。。。

跑去看看日志里面,真的没有取到 InetAddress。

事情到这里就比较明显了。因为InetAddress 调用系统级查询
系统查了,等待5秒?没有响应,直接返回失败
程序继续往下走了。

突然悠悠一个问题问了过来,为啥有时候又挺快呢?
问的好!ping 同一个 A。即使没有报错。第二次再ping 没有等待了。立马返回 Name or service not known。。。

因为InetAddress 调用系统级查询
系统查了,之前就错的,但我记录了,我找不到,我直接返回失败
程序继续往下走了。

好家伙,还有这招。学到了

解决方案:
怎么办?
找不到那就让他找到!命令行输入:
hostname 记录下这个名字 A
命令行输入:

sudo vim /etc/hosts

:wq 保存下

xxx.xx.xxx.xxx   A

完事。

到这就结束了?no no no
为啥每次接口都直接去查本地ip呢。服务器既然已经在那。
所以改成每次启动项目的时候直接拿到 ip,然后放到内存里面。
后面就直接去拿内存中的值,减少系统的操作。又省了一度电,nice

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号