Existe alguma diferença executando dhcrelay com processo múltiplo ou processo único?

3

Eu quero perguntar sobre o mecanismo de execução do dhcreay. Podemos rodar dhcrelay com dois comandos, então ele vai rodar como 2 process

dhcrelay -i eth3 172.16.17.3
dhcrelay -i eth1 172.16.17.5

#ps ax | grep dhcre
26464 ?        Ss     0:00 /usr/sbin/dhcrelay -i eth3 172.16.17.3
26465 ?        Ss     0:00 /usr/sbin/dhcrelay -i eth1 172.16.17.5

ou com um único comando, em outras palavras, processo único

dhcrelay -i eth3 -i eth1 172.16.17.3 172.16.17.5

#ps ax | grep dhcre
28127 ?        Ss     0:00 /usr/sbin/dhcrelay -i eth1 -i eth3 172.16.17.3 172.16.17.5

Gostaria de saber se existe alguma diferença técnica entre essas duas maneiras, exceto a contagem de processos?

    
por ibrahim 14.12.2012 / 15:35

1 resposta

0

Ao analisar o código-fonte , há algumas coisas que saltam que parece ser afetado pela execução de um único comando versus vários comandos.

Primeiro, este comentário em dispatch.c :

/*
 * Wait for packets to come in using poll().  When a packet comes in,
 * call receive_packet to receive the packet and possibly strip hardware
 * addressing information from it, and then call through the
 * bootp_packet_handler hook to try to do something with it.
 */

Parece que dhcrelay.c faz uso de uma arquitetura de pesquisa . Este parece fazer uso de um tempo limite (baseado em tempo) ao pesquisar uma das interfaces (por exemplo: -i eth0 ou -i eth1 ).

Isto parece indicar que existe algum potencial para bloquear uma interface enquanto a outra está sendo pesquisada.

Outro trecho, desta vez dentro da função dispatch() , está pesquisando uma das interfaces especificadas:

/* Wait for a packet or a timeout... XXX */
count = poll(fds, nfds, to_msec);

Depois que a função de pesquisa acima atingir o tempo limite ou receber um pacote dhcrelay passa para a "próxima" interface:

    /* Get the current time... */
    time(&cur_time);

    i = 0;
    for (l = protocols; l; l = l->next) {
      struct interface_info *ip = l->local;

      if ((fds[i].revents & (POLLIN | POLLHUP))) {
        fds[i].revents = 0;
        if (ip && (l->handler != got_one ||
            !ip->dead))
          (*(l->handler))(l);
        if (interfaces_invalidated)
          break;
      }
      i++;
    }
    interfaces_invalidated = 0;
  } while (1);

Observe que todo o dispatch contém um loop while(1) .

Então, o que isso tudo significa?

Eu diria que se você tem uma rede com muito tráfego com muitos hosts e suas concessões DHCP são relativamente curtas, então pode querer considerar a execução de 2 instâncias do dchrelay.

Se, no entanto, sua rede for relativamente pequena e seus tempos limite de concessão do DHCP forem relativamente longos, a execução de uma única instância deverá ser suficiente.

Algumas coisas adicionais a serem consideradas

  • A execução de 2 instâncias permite manter arquivos de log separados para cada um.
  • A execução de 2 instâncias permite que um relayer seja reiniciado sem afetar o outro.
por 24.01.2013 / 09:09