多年来,我一直在 Amazon EC2 实例上托管一个网站。最近,用户抱怨速度缓慢和连接失败。我检查了 EC2 LAMP 服务器和 RDS 数据库服务器上的内存和 CPU 使用率,两者似乎都在正常范围内。
网络服务器
- CPU 使用率平均约为 15%,偶尔会达到 50-60% 左右,每天约有两次
- 内存使用量总计 3.5G,已使用 3.2G,缓存 2.7G,交换使用量为零
数据库服务器
- CPU 使用率通常为 2-5%,每天都会出现峰值。这些峰值在大约一周内逐渐升高,但从未超过 10%
- DB 连接数低于 1(偶尔会达到 2)
- 5GB 可用 RAM
使用 netstat,我可以看到在任何给定时间都有大约 1000 个到 Web 服务器的连接:
$ netstat -ant | wc -l 1089
在问题发生当天早些时候,我看到这个数字高达 1480。
所有这些都让我认为该机器是通过网络找到的。即,没有足够的可用网络带宽来提供所有请求的数据。我认为带宽不足可能是机器的瓶颈。
有人能建议如何确定这台机器是否确实受到网络带宽的限制吗?如果我能构建一个表明问题的网络使用情况图表,那将非常有帮助。我不确定这会是什么样子,但我想象着一张图表,显示性能不佳时的硬平台期。
我尝试在此处附加 AWS 监控图表的屏幕截图:
编辑:今天早上,当服务器开始变慢时,我正在监控服务器,但一直找不到任何资源瓶颈。Web 服务器的内存和 CPU 使用率似乎很好。数据库服务器的内存和 CPU 使用率似乎很好。我没有看到任何过分的网络带宽使用量但服务器对页面请求的响应却非常慢。然后问题就突然消失了。
虽然问题仍然存在,但从用户角度(使用 Firefox)来看,TLS 握手似乎存在一些缓慢的问题,非常喜欢这个问题但我的 apache 服务器已将 HostnameLookup 设置为离开。
无论瓶颈是什么,它似乎都会阻止网络连接。在速度缓慢期间,总网络连接数稳定在 800 左右:
netstat -n | wc -l
虽然 Web 服务器到数据库的连接数稳定在 200 左右:
netstat -an | grep <db-server-ip-here> | wc -l
一旦问题过去(这似乎相当不稳定),那么这些数字跳将这些值增加一倍,服务器的运行速度就会快如闪电。
答案1
我们在 Speedtest.net 的一个较高速度统计集群上遇到了类似的问题 - 并且我们发现我们案例中的解决方案并未在 AWS 上公开记录;我们必须直接与 Nitro 团队合作来解决这个问题。
我们的机器带宽低,PPS 低(每秒约 10,000 个数据包),一直在丢包。我们无法弄清楚丢包的原因,因为我们完全符合机器性能的公共指导方针。这台机器是一个 statsd 聚合器,因此数千台机器向它发送 UDP 数据报。“流”计数是一个关键点。
事实证明,如果您在监听端口上有任何安全组限制发送 IP 范围,AWS 会对该给定端口施加 conntrack 限制。如果超出连接数限制,AWS 将默默丢弃数据包。除了在网络图上看到“削波”峰值外,没有统计数据可以揭示这一点。实例大小越大,conntrack 配额就越大。
解决方案是将给定服务端口的入站允许源 IP 范围设置为 0.0.0.0 - 这会关闭 AWS 端的连接跟踪并删除 conntrack 限制。最终,这意味着您必须通过仔细的子网划分和机器内核防火墙自行处理防火墙。
我不能说您是否遇到了同样的问题,但这是我们遇到的导致 AWS 出现无法解释的网络问题的问题。