Я хочу спросить о механизме работы 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 относительно велико, то запуск одного экземпляра вполне подойдет.