与环回地址相比,IP 地址非常慢

Yog*_*shR 2 linux ubuntu loopback ipv4 amazon-web-services

我有一个 AWS EC2 虚拟机。我想在同一台机器上托管的 PostgreSQL 服务器上运行一堆脚本。当我在脚本中使用服务器的 IP 地址时,每个脚本花费了将近 5 秒。但是当我使用环回地址而不是服务器 IP 时,每个脚本几乎不需要 1 秒。

可能是什么问题?

我在不同的服务器上执行了相同的活动,脚本在 IP 和环回地址上花费的时间几乎相同。

HBr*_*ijn 7

默认情况下,当在服务器本身上配置该 IP 地址时,从系统本身到服务器的(公共)IP 地址的 Linux 流量将不会进入实际的 NIC 或通过线路传输。

默认情况下,Linux 使用单个网络堆栈,并且与所有配置的 ip 地址之间的通信将在 Linux 内核的网络堆栈中的内存中,即使源和目标 ip 地址与不同的 NIC 相关联。

因此,与该 IP 地址通信时的网络速度应与环回接口相同,并且仅受系统速度的限制,而不是网络上行链路的线速(并且通常会超过该上行链路的带宽)。

当这些速度存在显着差异时,会想到该默认行为的一些显着例外:

  • 服务器的公共 ip 地址(或您使用的任何 DNS 名称解析为)不是该系统的配置 ip 地址
    ip addr.

    • 例如,在许多云部署中,与实例关联的公共 IP 地址是在提供商网络中配置和维护的 NAT 构造,而该公共 IP 地址未在服务器本身中配置。(这也是允许您使用管理层从一个系统中删除该公共 ip 地址并将其分配给另一个系统的原因。)就您的系统而言,从服务器到该公共 ip 地址的流量不会,有一个当地的目的地。它需要在外部 NAT 映射将其导回之前传输。
    • 类似地,主机名/公共 ip 地址可能与负载均衡器/反向代理相关联,当应用程序尝试自行寻址时,请求将通过负载均衡器路由回节点(甚至可能路由到完全不同的节点)。
  • 系统可以启用策略路由。这会迫使系统通过线路将不同 NIC 上的不同 IP 地址之间的流量发送到外部网络。与ip rule list.
  • 网络命名空间允许 Linux 内核设置多个网络堆栈,每个网络堆栈都有自己的 IP 和路由设置。不同网络命名空间之间的流量通常也会被路由到系统本身之外,并且比环回接口慢得多。检查ip netns list

我对 Postgres 并不太熟悉,但通常你可以通过使用套接字连接而不是使用本地主机或外部 IP 地址来获得除了 TCP/IP 连接之外还支持unix 域套接字的服务的最佳性能。消除在 IP 数据包中成帧数据的开销。

因此,与其使用外部 IP 地址或 localhost 127.0.0.1 地址,不如启用并连接到 Postgresql 套接字。