使用请求的响应时间非常长

时间:2019-07-07 08:07:18

标签: python python-3.x ubuntu amazon-ec2 python-requests

说明

我有一个运行python应用程序的AWS ec2实例(ubuntu 16)。在其中,我调用了一些Facebook Account Kit API,也调用了Google Play Store API。在我两周前重新启动实例之前,它们都工作正常。

重新启动后,请求需要5分钟以上才能完成,这完全是不可接受的。我必须手动将超时设置为超过10分钟,以使请求能够完成。

问题仅发生在我的一台服务器上,我在另一台服务器上以相同的环境运行,它的响应时间不到一秒,效果很好。

临时修复

要暂时解决此问题,然后使用代理服务器完成请求。

  1. API服务器(服务器出现超时问题)
  2. 代理服务器运行python脚本并返回结果
  3. API服务器(服务器出现超时问题)将响应返回给客户端

情况

  1. 我尝试在API服务器上使用curl,它的响应时间还不到1秒。
  2. 我使用requests在python环境中进行了尝试,并且响应时间非常糟糕,超过5分钟。
    1. 如果我设置标题{'Connection' : 'keep-alive' },则第二个请求将继续正常。
    2. 我打开了日志记录,似乎请求停留在建立到目标的连接上。
  3. 我尝试使用编写的API,并且响应时间也很糟糕,超过5分钟。

当前代码

响应时间较慢的请求。

url_get_access_token = "https://graph.accountkit.com/v1.3/access_token?grant_type=authorization_code&code=%s&access_token=AA|%s|%s"
url_get_access_token = url_get_access_token % (token, self.facebook_app_id, self.facebook_account_kit_scert)
response = requests.get(url_get_access_token)
body = response.json()

我上面提到的代理服务器是同一子网中的另一个实例,但是我使用DNS服务器进行呼叫。

response = requests.get("https://proxyserver.com/somepath", params={})

由于它仅影响其中一台服务器,这是DNS问题还是AWS配置?请帮忙,谢谢。

更新

定时卷发的结果,似乎使用iPv6进行调用会花费更多时间。

$ time curl -4 -s https://graph.accountkit.com/v1.3
$ time curl -6 -s https://graph.accountkit.com/v1.3

iPv4

real    0m0.665s
user    0m0.068s
sys 0m0.020s

iPv6

real    2m7.180s
user    0m0.008s
sys 0m0.000s

1 个答案:

答案 0 :(得分:0)

我想到两个项目。

DNS

调试:

$ cat /etc/resolv.conf

$ time dig aaaa graph.accountkit.com

您可能列出了多个名称服务器, 并不是所有人都反应灵敏, 这样一来,在死者身上超时时,您就需要进行长时间的查找。

TCP

调试:

$ time curl -4 -s https://graph.accountkit.com/v1.3
$ time curl -6 -s https://graph.accountkit.com/v1.3

它将显示“无效的OAuth 2.0访问令牌”,是的,很好。 我们感兴趣的是连接需要多长时间, 发送GET并检索Web文档。

此域同时提供A和AAAA地址。 如果要烘烤IPv6,则可能需要一段时间 使requests.get()能够故障转移到IPv4。

编辑

有人破坏了您的IPv6传输。 在现代互联网中这是不可接受的。 丢弃的数据包超时可能导致经过127秒的时间。 traceroute6ping6之类的工具可以 帮助您或网络专业人员进行诊断 损失在哪里。 ACL可能太紧, 正在丢弃不应该的IPv6数据包。 丢弃ICMP尤其糟糕。 为了使TCP正常工作,必须交付ICMP。

tcpdump(或Wireshark)数据包跟踪会有所帮助 确定到底是什么向南。 您可能正在患PMTUD black-holing。 看看是否显示任何“数据包太大”的ICMP报告:

$ sudo tcpdump -tvvvni eth0 icmp6 and ip6[40+0]==2 

仅查看出站端口443 TCP重新传输的时间 将为为什么失败两分钟提供很多启示 然后比特突然开始流动。