如何排查 VPC 中的 EC2 Linux 或 Windows 实例与本地主机之间通过互联网网关通信时的网络性能问题?

4 分钟阅读
0

我的 Amazon Elastic Compute Cloud(Amazon EC2)实例与本地主机之间通过互联网网关通信时存在丢包或延迟问题。如何排查这些网络性能问题?

简短描述

要诊断丢包或延迟等网络问题,请先测试网络以隔离问题的根源。以下解决方法可帮助确定问题的根源来自网络还是应用程序。最佳实践是确定性能结果基准,以便在观察性能问题时比较结果。

在开始排查问题之前,请检查以下事项:

  • 确保在两个终端节点(EC2 实例和本地部署主机)上均已安装网络实用程序。
  • 使用支持增强联网的 EC2 实例,并确保驱动程序为最新版本。增强联网可提供更高的 I/O,具有较低的 CPU 占用率,这有助于在运行性能测试时避免实例级别的问题。如果未开启增强联网功能,请参阅 Linux 上的增强联网Windows 上的增强联网
  • 连接到您的 EC2 实例以访问实例,确保您的 EC2 实例与本地主机之间存在端到端连接。

解决方法

安装以下工具以帮助排查故障并测试您的网络:

  • AWSSupport-SetupIPMonitoringFromVPC:用于收集各种网络指标,如丢包、延迟、MTR、tcptraceroute 和 tracepath。
  • MTR:用于检查 ICMP 或 TCP 数据包丢失和延迟问题。
  • Traceroute:用于确定延迟或路由问题。
  • Hping3:用于确定端到端 TCP 数据包丢失和延迟问题。
  • Tcpdump:用于分析数据包捕获示例。

使用自下而上的方法检查 traceroute 或 MTR 报告中的跃点。例如,检查最后一个跃点或目标处的丢失,然后查看以下跃点。如果丢包或延迟问题延续到最后一个跃点处,则可能存在网络或路由问题。如果路径中一个跃点上的控制平面速率限制存在问题,则该节点上可能出现丢包或延迟。检查报告的最后一个跃点是否是命令中指明的目标。如果不是,则可能存在由限制性安全组引起的问题。

使用 AWSSupport-SetupIPMonitoringFromVPC 测试性能

此内置工具可以收集排查网络故障所需的诸多指标。有关更多信息,请参阅 Debugging tool for network connectivity from Amazon VPC

Linux 实例的性能问题排查

查看 Linux 性能统计信息

如果您有权访问源实例或目标实例,请检查 CPU、内存利用率和平均负载是否存在问题。

使用 MTR 测试性能

Linux MTR 命令会连续提供更新的输出。您可以利用此输出来分析网络性能。此诊断工具结合了 traceroute 和 ping 实用程序的功能。大多数 Linux 发行版都预安装了 traceroute 和 MTR。您也可以从您使用的发行版的软件包管理器中下载该实用程序。

要安装 MTR,请运行以下命令:

Amazon Linux:

sudo yum install mtr

Ubuntu:

sudo apt-get install mtr-tiny

要使用 MTR 测试网络性能,请在 EC2 实例的公有 IP 地址与本地主机之间双向运行此测试。如果方向反转,TCP/IP 网络上的节点之间的路径可能会发生变化。因此,获得两个方向的 MTR 结果非常重要。您可以使用基于 TCP 的跟踪而非 ICMP,因为大多数 Internet 设备都不会优先处理基于 ICMP 的跟踪请求。

检查您的数据包丢失情况。单个跃点上的数据包丢失通常并不能表示存在问题。这种丢失可能是控制平面策略导致“ICMP 超时”消息被丢弃的结果。如果您注意到在达到目标跃点之前持续丢包,或者在连续多个跃点间存在数据包丢失,则可能表示存在问题。

**注意:**多项请求超时很常见。

基于 ICMP 的 MTR:

mtr -n -c 200 <Public IP EC2 instance/on-premises host> --report

基于 TCP 的 MTR:

mtr -n -T -c 200 <Public IP EC2 instance/on-premises host> --report

-T 参数会执行基于 TCP 的 MTR,--report 选项则会将 MTR 置于报告模式。MTR 运行 -c 选项指定的周期数。打印统计信息,然后退出。

**注意:**基于 TCP 的 MTR 会测试目标 TCP 端口 80,然后将特定目标 TCP 端口传输到 MTR,其以 -P 结尾,后接端口号。以下是传输到 MTR 的目标 TCP 端口 443 的示例:

mtr -n -T -c 200 <Public IP EC2 instance/on-premises host> -P 443 --report

使用 traceroute 测试性能

Linux traceroute 实用程序会识别从客户机节点到目标节点的路径。该实用程序会记录每个路由器响应请求的时间(以毫秒为单位)。该实用程序还会计算每个跃点到达目标之前所需的时间。

要安装 traceroute,请运行以下命令:

Amazon Linux:

sudo yum install traceroute

Ubuntu:

sudo apt-get update
sudo apt-get install traceroute

**注意:**如果您运行 MTR 报告,则无需使用 traceroute。MTR 向目标提供延迟和丢包统计信息。

确保在两个方向上都打开了端口 22 或正在测试的端口。要使用 traceroute 排查网络连接问题,请运行命令:请从客户端到服务器,然后从服务器再回到客户端。如果方向反转,TCP/IP 网络上的节点之间的路径可能会发生变化。请使用基于 TCP 的跟踪(应用程序端口)而非 ICMP,因为大多数互联网设备都不会优先处理基于 ICMP 的跟踪请求。

基于 ICMP 的 traceroute:

sudo traceroute -I <Public IP of EC2 instance/on-premises host>

基于 TCP 的 traceroute:

sudo traceroute -n -T -p 22 <Public IP of EC2 instance/on-premises host>

-T -p 22 -n 参数在端口 22 上执行基于 TCP 的跟踪。

**注意:**您可以使用特定于应用程序的端口进行测试。使用特定端口来了解路径中是否有任何中间设备丢弃了应用程序流量。

使用 hping3 测试性能

Hping3 是一种面向命令行的 TCP/IP 数据包汇编器和分析器,用于测量 TCP 连接上的端到端丢包和延迟。除了针对 ICMP echo 请求外,hping3 还支持 TCP、UDP 和 RAW-IP 协议。Hping3 还包括可以在覆盖的频道之间发送文件的 traceroute 模式。Hping3 设计用于扫描主机、协助渗透测试、测试入侵检测系统以及在主机之间发送文件。

MTR 和 traceroute 会捕获每跃点延迟。但是,除了数据包丢失之外,hping3 还会生成更多结果,显示 TCP 上的端到端最小/平均/最大延迟。要安装 hping3,请运行以下命令:

Amazon Linux 2。安装适用于 RHEL 7 的 EPEL 发行包并启用 EPEL 存储库

sudo amazon-linux-extras install epel -y

Amazon Linux 2:

sudo yum --enablerepo=epel install hping3

Ubuntu:

sudo apt-get install hping3

以下命令通过端口 0 发送 50 个 TCP SYN 数据包。默认情况下,hping3 将 TCP 标头发送到目标主机的端口 0,其窗口大小为 64,并且不带 TCP 标记:

sudo hping3 -S -c 50 -V <Public IP of EC2 instance/on-premises host>

以下命令通过端口 22 发送 50 个 TCP SYN 数据包:

sudo hping3 -S -c 50 -V <Public IP of EC2 instance/on-premises host> -p 22

**注意:**确保端口 22 或您正在测试的端口已打开。

使用 tcpdump 测试数据包捕获示例

在诊断丢包/延迟问题时,最好在 EC2 实例与本地主机上同时执行数据包捕获。这样做有助于识别请求和响应数据包,以便在网络层和应用程序层隔离问题。最佳实践是首先启动抓包,然后再启动流量。这有助于捕获流量中的所有数据包。要安装 tcpdump,请运行以下命令:

Amazon Linux:

sudo yum install tcpdump

Ubuntu:

sudo apt-get install tcpdump

安装 tcpdump 后,您可以运行以下命令来捕获 tcp 端口 22 的流量并将其保存在 pcap 文件中。

sudo tcpdump -i eth0 port 22 -s0 -w samplecapture.pcap

**注意:**tcpdump 标志 -i 指定了 tcpdump 在其中捕获流量的实例接口。您可能需要将接口从 eth0 更改为环境中已配置的接口。

Windows 实例的性能问题排查

检查 ECN 能力

1.    运行以下命令以确定是否启用了显式拥塞通知(ECN)功能:

netsh interface tcp show global

2.    如果已激活 ECN 功能,请运行以下命令将其停用:

- netsh interface tcp set global ecncapability=disabled

3.    如果性能没有改观,可以使用以下命令重新激活 ECN 功能:

netsh interface tcp set global ecncapability=enabled

检查跃点,排查 TCP 端口连接问题

首先使用 MTR 或 tracert 检查跃点:

MTR 法:

1.    下载并安装 WinMTR

2.    在主机部分输入目标 IP,然后选择启动

3.    测试运行一分钟,然后选择停止

4.    选择复制到剪贴板并将输出粘贴到文本文件。

5.    通过填充到目标中的 % 列来查看任何丢包情况。

**注意:**请忽略任何消息为 No response from host(主机无应答)的跃点。此消息说明这些特定的跃点未响应 ICMP 探测。

6.    使用自下而上的方法通过 MTR 报告检查跃点。例如,检查最后一个跃点或目标上是否发生丢包,然后检查前面的跃点。

Tracert 法:

如果您不想安装 MTR,则可以使用 tracert 命令实用工具。

1.    对目标 URL 或 IP 地址执行 tracert

2.    查找往返时间 (RTT) 突然增高的任何跃点。RTT 突增可能说明存在高负载节点,这进而会导致流量延迟或丢包。

注意:-d 选项不能将 IP 地址解析为主机名。如果需要将 IP 解析为主机名,请删除 -d。

tracert -d <Public IP of EC2 instance/on-premises host>

然后检查 TCP 端口连接。

**注意:**由于 WinMTR 和 tracert 都基于 ICMP,您可以使用 tracetcp 来排查 TCP 端口连接问题。

1.    下载 WinPcaptracetcp

2.    提取 tracetcp 压缩文件。

3.    将 tracetcp.exe 复制到 C 盘。

4.    安装 WinPcap。

5.    打开命令提示符,使用 *C:\Users\username>cd * 命令从根 WinPcap 进入 C 驱动器。

6.    使用以下命令运行 tracetcptracetcp.exehostname:porttracetcp.exe ip:port

检查 Windows 任务管理器

如果您有权访问源实例或目标实例,可检查 Windows 任务管理器。查找与 CPU 和内存利用率或平均负载有关的问题。

抓取数据包

**注意:**在诊断丢包或延迟问题时,最佳实践是在 EC2 实例与本地主机上同时执行抓包。这有助于识别请求和响应数据包,以便在网络层和应用程序层隔离问题。最佳实践是首先启动抓包,然后再启动流量。这有助于捕获流量中的所有数据包。

1.    安装 Wireshark 并进行抓包。

2.    使用以下筛选条件以在抓包中隔离特定源之间的流量:(ip.addr eq source_IP) &&(tcp.flags.syn == 1)。输出显示了该源 IP 发起的所有 tcp 流。

3.    选择含有相关源 IP 和目标 IP 的行。

4.    选择的上下文(右键单击)菜单,然后选择跟随TCP 流。这将返回您要调查的源 IP 和目标 IP 之间的 TCP 流。

5.    查找重新传输、重复数据包或 TCP 窗口已满窗口大小为零等 TCP 窗口大小通知。这些通知可能表明 TCP 缓冲区空间不足。

如果您发现数据包丢失,或者跃点数与基准测试相比有显著变化,请参阅您的联网设备供应商文档。如果在多宿主网络环境中工作,请使用其他 ISP 执行这些测试。


相关信息

Linux 上的增强联网

Windows 上的增强联网

AWS 官方
AWS 官方已更新 1 年前