假设我需要将数据从一个服务发送到同一主机上的另一个服务。为此,我可以使用本地主机:端口或者真实域名:端口(假设它缓存了或者可以通过本地 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接口。