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

4 分钟阅读
0

我想排查 Amazon Virtual Private Cloud (Amazon VPC) 中的 Amazon Elastic Compute Cloud (Amazon EC2) 实例与本地主机通过互联网网关时出现的数据包丢失或延迟问题。

简短描述

要诊断数据包丢失或延迟等网络问题,首先测试网络以找出问题的根源。在对问题进行故障排查之前,最佳做法是对性能结果进行基准测试

先决条件:

解决方法

安装以下工具来帮助排查和测试您的网络:

  • AWSSupport-SetupIPMonitoringFromVPC:用于收集网络指标,例如数据包丢失、延迟、MTR、tcptraceroute 和 tracepath。
  • MTR:用于检查是否存在 ICMP 或 TCP 丢包和延迟问题。
  • Traceroute:用于确定延迟或路由问题。
  • Hping3:用于确定端到端 TCP 丢包和延迟问题。
  • Tcpdump:用于分析抓包样本。

查看 traceroute 或 MTR 报告

使用自下而上的方法查看 traceroute 或 MTR 报告中的跃点。采用自下而上的方法,首先检查最后一个跃点或目的地是否存在丢包,然后查看之前的跃点。

  • 如果数据包丢失或延迟问题一直持续到最后一个跃点,则可能存在网络或路由问题。
  • 如果该节点上存在控制面板速率限制,则路径中的某一个跃点可能会出现数据包丢失或延迟。
  • 检查报告的最后一个跃点是否是命令中注明的目的地。如果不是,则可能存在由限制性安全组引起的问题。

使用 AWSSupport-SetupIPMonitoringFromVPC 测试性能

这个内置工具会收集对网络进行故障排查所需的许多指标。有关详细信息,请参阅 Amazon VPC 网络连接调试工具

Linux 实例的性能问题排查

查看 Linux 性能统计信息

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

使用 MTR 测试性能

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

运行以下命令安装 MTR:

Amazon Linux:

sudo yum install mtr

Ubuntu:

sudo apt-get install mtr-tiny

要使用 MTR 测试网络性能,请在 EC2 实例的公有 IP 地址和本地主机之间双向运行此测试。如果方向相反,则 TCP/IP 网络的节点之间的路径可能会改变。因此,最佳做法是获得双向的 MTR 结果。您可以使用基于 TCP 的跟踪而非 ICMP,因为大多数互联网设备会降低基于 ICMP 的跟踪请求的优先级。

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

**注意:**一些请求超时很常见。

PUBLIC_IP 替换为公有 IP EC2 实例本地主机。

基于 ICMP 的 MTR:

mtr -n -c 200 PUBLIC_IP --report

基于 TCP 的 MTR:

mtr -n -T -c 200 PUBLIC_IP --report

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

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

mtr -n -T -c 200 PUBLIC_IP -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

基于 TCP 的 traceroute:

sudo traceroute -n -T -p 22 PUBLIC_IP

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

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

使用 hping3 测试性能

Hping3 是一种命令行 TCP/IP 包汇编器和分析器,用于测量 TCP 连接上的端到端丢包和延迟。在 Die.net 网站上下载 hping3

除了 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

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

sudo hping3 -S -c 50 -V PUBLIC_IP -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. 从 Sourceforge.net 网站下载并安装 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

  3. 然后,检查 TCP 端口连接。

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

  1. 从 NetworkHunt.com 网站下载 tracetcp ZIP 文件
  2. 解压 tracetcp ZIP 文件。
  3. tracetcp.exe 复制到 C 盘。
  4. 从 WinPcap.org 网站下载并安装 WinPcap
  5. 打开命令提示,使用 C:\Users\username>cd 命令将 WinPcap root 到 C 盘。
  6. 要运行 tracetcp,请使用以下命令:
    tracetcp.exehostname:port
    -或-
    tracetcp.exe ip:port

检查 Windows 任务管理器

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

抓取数据包

**注意:**在诊断数据包丢失或延迟问题时,最佳做法是在 EC2 实例和本地主机上同时抓包。此操作有助于识别请求和响应数据包,以隔离网络和应用程序层的问题。最佳做法也是先开始抓包,然后启动流量。这些操作有助于捕获流量的所有数据包。

  1. 从 Wireshark.org 网站下载并安装 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 进行这些测试。

AWS 官方已更新 8 个月前