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

Есть ли разница в запуске dhcrelay с несколькими процессами или с одним процессом?

Я хочу спросить о механизме работы dhcreay. Мы можем запустить dhcrelay с двумя командами, тогда он будет работать как 2 процесса

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

или с помощью одной команды, другими словами, одного процесса

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

Мне было интересно, есть ли между этими двумя способами какая-либо техническая разница, кроме подсчета процессов?

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

Первый этот комментарий в 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.
 */

Казалось бы, dhcrelay.c использует архитектура опроса. Это похоже на использование тайм-аута (основанного на времени) при опросе одного из интерфейсов (например: -i eth0 или -i eth1).

Казалось бы, это указывает на то, что существует некоторая вероятность блокировки одного интерфейса во время опроса другого.

Еще один фрагмент, на этот раз в dispatch() функция, она опрашивает один из указанных интерфейсов:

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

После того, как вышеуказанная функция опроса либо истечет, либо получит пакет dhcrelay переходит к "следующему" интерфейсу:

    /* 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);

Обратите внимание, что весь dispatch содержит while(1) петля.

Так что все это значит?

Я бы сказал, что если у вас интенсивно загруженная сеть с большим количеством хостов, а аренда DHCP относительно коротка, тогда вы может хочу рассмотреть запущенные 2 экземпляра dchrelay.

Если, однако, ваша сеть относительно мала, а время ожидания аренды DHCP относительно велико, то запуск одного экземпляра вполне подойдет.

Некоторые дополнительные моменты, которые следует учитывать

  • Запуск двух экземпляров позволяет вам вести отдельные файлы журнала для каждого.
  • Запуск двух экземпляров позволяет перезапустить один ретранслятор, не влияя на работу другого.