本地主机或真实主机名(真实 IP)

本地主机或真实主机名(真实 IP)

假设我需要将数据从一个服务发送到同一主机上的另一个服务。为此,我可以使用本地主机:端口或者真实域名:端口(假设它缓存了或者可以通过本地 DNS 解析)。我确信最好使用本地主机:端口因为lo接口延迟较少。这是正确的吗?

答案1

一般来说不是。在 Linux 中,只有当特定软件检测到这种情况并切换到 unix 套接字时(例如 mysql 就是这样的,据我所知),这才是正确的。

否则,这些数据包将经过完全相同的路径。lo 地址 (127.0.0.1) 和其他本地地址将添加到“本地”路由表(您可以使用“ip route view table local”查看它)。在这方面它们都很相似。

为了说明我的话,让我们尝试一个简单的程序(用 tcl,这是编写 tcp 服务器最简单的语言)。(要自己尝试,请将它们保存到文件中并使用“tclsh filename.tcl”运行)

服务器:

proc accept {chan addr port} {           ;# Make a proc to accept connections
    #puts "$addr:$port says [gets $chan]" ;# Receive a string
    puts $chan goodbye                   ;# Send a string
    close $chan                          ;# Close the socket (automatically flushes)
}                                        ;#
socket -server accept 12345              ;# Create a server socket
vwait forever

客户:

set start [clock seconds]
puts $start
for {set i 0} {$i < 1000000} {incr i} {
    set chan [socket 192.168.7.121 12345]         ;# Open the connection
    puts $chan hello                         ;# Send a string
    flush $chan                              ;# Flush the output buffer
    #puts "127.0.0.1:12345 says [gets $chan]"  ;# Receive a string
    close $chan                              ;# Close the socket
}
set ends [clock seconds]
puts $ends
puts [expr $ends-$start]

基准测试:当我使用 127.0.0.1 运行时,1000000 个循环耗时 35 秒。

当我使用 192.168.7.121(我的笔记本电脑 wlan 接口的地址,我在“套接字地址端口”子句中指定它)运行时:耗时 37 秒。这个差异实际上只不过是一个余量。

因此,与使用 fqdn 和其他 IP 地址相比,使用 tcp 到 localhost 不会获得任何好处。要真正从本地性中获益,您必须使用 unix 域套接字(AF_UNIX 系列),它确实比 tcp 快得多。

在某些情况下,您必须使用真实地址,而不是本地主机。这种情况就是配置 Kerberos 时。这实际上与速度无关,我仅说明了这一点,以给出您无法使用本地主机的示例。

答案2

如果您的问题是 127.0.0.1 与 192.168.0.5(或您的服务器托管的其他本地 IP 地址)的性能,那么性能将大致相同,因为网络堆栈将检查其 ARP 表以确定将数据包发送到何处,注意到它是一个本地地址并在本地传送它。它永远不会到达 NIC 卡驱动程序,并导致 NIC 卡驱动程序使用任何 CPU 周期。唯一的性能影响是任何仅适用于其他本地地址而不适用于 127.0.0.1 的 iptables 规则。

如果您确实想使用 real.domain.name 并将其指向 127.0.0.1,请修改本地主机的 /etc/hosts 文件:

127.0.0.1 localhost localhost.localdomain real.domain.name

然后就不需要进行 DNS 查找了(检查 /etc/hosts 非常快)。如果 real.domain.name 移动到了另一台主机,也可以从 /etc/hosts 中删除它并使用该主机(现在是远程主机),而无需以任何方式更改应用程序的配置。

答案3

如果您要连接到同一主机上的本地服务,请始终使用本地主机地址,而不是 IP 地址、主机名或 FQDN。这三个地址可能会在您的环境中发生变化,并且不能始终保证您能够连接到服务,并且还具有其他网络依赖性,例如 DNS 解析。

答案4

假设您有一个本地 DNS 缓存,我会使用域名,而不是本地主机。

这样,如果您将服务移至另一台主机,它仍然可以工作,而本地主机将始终停留在您的本地机器上。

对于此条目来说,拥有足够长的 DNS ttl 将使您远离 DNS 滞后(这可能不那么重要,具体取决于您的环境)。

使用本地IP会很快,无论它是否位于lo接口。

相关内容