Назад | Перейти на главную страницу

Localhost или реальное имя хоста (реальный IP)

Предположим, мне нужно отправить данные из одних служб в другие на том же хосте. Для этого я могу использовать localhost: порт или real.domain.name:port (давайте думать, что он кэширован или может быть разрешен локальным DNS). Я уверен что лучше использовать localhost: порт из-за меньшего количества задержек на lo интерфейс. Это правильно?

В общем, нет. В Linux это может быть правильным, только если конкретное программное обеспечение обнаруживает это условие и переключается на сокеты unix (например, mysql do, afaik).

В противном случае эти пакеты пройдут точно по тому же пути. Адрес 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 секунд. Эта разница на самом деле не более чем маржа.

Итак, нет, вы ничего не получите при использовании tcp для localhost по сравнению с использованием fqdn и другого IP-адреса. Чтобы действительно извлечь выгоду из локальности, вы должны использовать сокеты домена unix (семейство AF_UNIX), это действительно намного быстрее, чем tcp.

Бывает, что нужно использовать реальный адрес, а не localhost. В этом случае вы настраиваете Kerberos. На самом деле речь не идет о скорости, я сказал это только для того, чтобы привести пример, в котором вы не можете использовать localhost.

Если ваш вопрос заключается в производительности 127.0.0.1 по сравнению, например, с 192.168.0.5 (или каким-либо другим локальным IP-адресом, который размещен на вашем сервере), производительность будет в значительной степени идентична, потому что сетевой стек будет проверять свою таблицу ARP, чтобы выяснить, где отправьте пакет, обратите внимание, что это локальный адрес, и доставьте его локально. Он никогда не поступит к драйверу сетевой карты и не вызовет использование каких-либо циклов ЦП драйвером сетевой карты. Единственное влияние на производительность окажут любые правила iptables, которые применяются только к другому локальному адресу, а не к 127.0.0.1.

Если вы действительно хотите использовать real.domain.name и указать его на 127.0.0.1, измените файл / etc / hosts вашего localhost:

127.0.0.1 localhost localhost.localdomain real.domain.name

Тогда поиск в DNS не требуется (проверка / etc / hosts выполняется очень быстро). Это также позволяет, если real.domain.name перемещается на другой хост, удалить его из / etc / hosts и использовать этот (теперь удаленный) хост без какого-либо изменения конфигурации вашего приложения.

Если вы подключаетесь к локальной службе на том же хосте, всегда используйте адрес localhost, а не IP-адрес, имя хоста или полное доменное имя. Эти три параметра могут меняться в вашей среде и не всегда гарантируют, что вы сможете подключиться к службе, а также иметь дополнительные сетевые зависимости, такие как разрешение DNS.

Предполагая, что у вас есть локальный кеш DNS, я бы использовал имя домена, а не localhost.

Таким образом, если вы переместите свою службу на другой хост, она все равно будет работать, тогда как localhost всегда будет зависать на вашем локальном компьютере.

Наличие DNS ttl, достаточно длинного для этой записи, убережет вас от задержки DNS (что может быть не так важно, в зависимости от вашей среды).

Использование локального IP-адреса будет быстрым, независимо от того, находится он на интерфейсе lo или нет.