已编辑:我的 AWS 系统中有问题。每几个请求几乎都需要 130 秒的时间来回答。当我说一些时,我的意思是 5 到 25 左右。通常,如果您取消慢速请求并再次发送,它只会快速响应。我还注意到任何请求都会发生这种情况,而不仅仅是特定请求。服务器和后端看起来并没有超载。系统如下:
ALB with sticky sessions | 2 Web servers | DB on RDS
系统在大多数时候使用 curl 时响应良好,但是当它需要很长时间时,这是响应输出:
这是任何 URL 上的 curl 测量时间。
time_namelookup: 0.004136
time_connect: 130.117558
time_appconnect: 130.125254
time_pretransfer: 130.125340
time_redirect: 0.000000
time_starttransfer: 130.172553
----------
time_total: 130.172615
除了 之外,从time_connect
页面加载之后的意义上说,请求很好。系统正常响应时间小于0.5秒。
我正在阅读有关此的内容,并且文档表明time_connect
,与
“从客户端的角度来看,time_connect 是 TCP 三次握手。它在客户端发送 ACK 后立即结束 - 它不包括该 ACK 到达服务器所需的时间。它应该接近往返时间(RTT) 到服务器..."
这是从这里拍摄的。
补充:系统本身是 nginx-Python,运行在 ec2 实例上,RDS 上有 MySQL 数据库,它提供来自 s3 的静态内容,用户也可以上传自己的文件。来自本地主机上的服务器(nginx-python ec2 实例) curl 总是很好,它永远不会花费很长时间。这让我相信这与 LB 和在 python 主机上监听的 nginx 有关。
补充:我也试过只在后端留下一台机器,问题并没有消失。
我在 AWS Cloudwatch、应用程序日志或数据库监控上找不到任何有意义的东西。关于我应该研究什么或如何解决此问题的任何想法?
编辑 3 感谢下面的评论:
# curl -v -I -L -k -w "@time.txt" -s "https://my-site.com/url/"
* Trying "
* Trying IP.ONE.from.AWS...
* connect to IP.ONE.from.AWS port 443 failed: Connection timed out
* TCP_NODELAY set
* Connected to my-site.com (IP.TWO.from.AWS) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
IP-ONE-from-AWS 和 IP-TWO-from-AWS 是来自我应该连接的 AWS 区域的 IP。
您已将负载均衡器放置在一个公有子网和一个私有子网中,这是一种无效配置,并且会导致与您观察到的行为类似的行为,因为一个均衡器为其所连接的每个子网分配了至少一个公有 IP。 .. 但根据定义,公共 IP 地址不起作用,除非子网是公共子网。
面向 Internet 的负载均衡器只需连接到公共子网。它们不需要附加到部署它们背后的实例(或应该部署)的私有子网或任何其他私有子网上。
或者,您可能打算将平衡器放置在两个公共子网中,但其中一个具有错误配置的 VPC 路由表或网络 ACL,它具有相同的净效应,并且在您连接到该 IP 地址时会阻止流量。