Localhost ou nome do host real (IP real)

2

Vamos supor que preciso enviar dados de um serviço para outro no mesmo host. Para isso eu posso usar localhost: port ou real.domain.name:port (vamos pensar que ele está em cache ou pode ser resolvido por DNS local). Tenho certeza de que é melhor usar localhost: port devido a menos atrasos na interface lo . Está correto ?

    
por ipeacocks 02.12.2015 / 18:51

4 respostas

3

Geralmente, não. No linux isso pode estar correto apenas se o software específico detectar essa condição e mudar para soquetes unix (como mysql do, afaik).

Caso contrário, esses pacotes passarão pelo mesmo caminho. O endereço lo (127.0.0.1) e outros endereços locais são adicionados à tabela de roteamento 'local' (você pode visualizá-lo com 'ip route view table local'). Eles são todos semelhantes a esse respeito.

Para ilustrar minhas palavras, vamos tentar um programa simples (em tcl, essa é a linguagem mais simples para escrever servidores tcp). (Para tentar sozinho, salve-os em arquivos e execute com 'tclsh filename.tcl')

Servidor:

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

Cliente:

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]

Benchmark: quando eu executo com 127.0.0.1, os ciclos de 1000000 levam 35 segundos.

quando eu corro com 192.168.7.121 (endereço da minha interface laptop wlan, eu especifico na cláusula 'socket address port'): demorou 37 segundos. Essa diferença não é mais do que uma margem.

Portanto, não, você não ganharia nada se estivesse usando tcp para localhost em comparação com o uso de fqdn e outro endereço IP. Para realmente se beneficiar da localidade você tem que usar sockets de domínio unix (família AF_UNIX), é realmente muito mais rápido que o tcp.

Há um caso em que você precisa usar um endereço real, não localhost. Esse caso é quando você configura o Kerberos. Isso não é realmente sobre velocidade, eu apenas afirmei isso para dar um exemplo onde você não pode usar o host local.

    
por 02.12.2015 / 19:23
2

Se a sua pergunta for o desempenho de 127.0.0.1 versus, por exemplo, 192.168.0.5 (ou algum outro endereço IP local que seu servidor hospede), o desempenho será praticamente idêntico porque a pilha de rede verificará sua tabela ARP para descobrir Para onde enviar o pacote, observe que é um endereço local e entregue-o localmente. Ele nunca chegará ao driver da placa NIC e fará com que qualquer ciclo de CPU seja usado pelo driver da placa NIC. O único impacto no desempenho seria qualquer regra do iptables que se aplicasse apenas ao outro endereço local e não ao 127.0.0.1.

Se você realmente quiser usar real.domain.name e apontá-lo para 127.0.0.1, modifique o arquivo / etc / hosts do seu localhost:

127.0.0.1 localhost localhost.localdomain real.domain.name

Então não há nenhuma pesquisa de DNS envolvida (verificar / etc / hosts é muito rápido). Isso também permite, se o real.domain.name for movido para outro host, para removê-lo de / etc / hosts e usar esse host (agora remoto) sem alterar a configuração do seu aplicativo de qualquer forma.

    
por 02.12.2015 / 21:54
0

Se você estiver se conectando a um serviço local no mesmo host, sempre use um endereço de host local e não o endereço IP, nome de host ou FQDN. Estes três podem mudar dentro do seu ambiente e nem sempre garantir que você é capaz de se conectar ao serviço e também ter dependências adicionais de rede e resolução de DNS.

    
por 02.12.2015 / 19:16
0

Supondo que você tenha um cache DNS local, eu usaria o nome de domínio, não o host local.

Dessa forma, se você mover seu serviço para outro host, ele ainda funcionará, enquanto o host local sempre estará armazenado em sua máquina local.

Ter um DNS longo o suficiente para essa entrada irá mantê-lo longe do atraso de DNS (que pode não ser tão importante, dependendo do seu ambiente).

Usar um IP local será rápido, não importa se está localizado na interface ou não.

    
por 02.12.2015 / 20:18