使用多进程运行 dhcrelay 和单进程运行 dhcrelay 有什么区别吗?

使用多进程运行 dhcrelay 和单进程运行 dhcrelay 有什么区别吗?

我想问一下 dhcrelay 的运行机制。我们可以用两个命令运行 dhcrelay,这样它就会作为两个进程运行

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

我想知道除了进程数量之外,这两种方式是否存在任何技术差异?

答案1

在查看源代码,有几件事情引人注目,似乎会受到运行单个命令与运行多个命令的影响。

首先是这个评论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 租约超时相对较长,那么运行单个实例就应该没问题。

其他需要考虑的事项

  • 运行 2 个实例允许您为每个实例维护单独的日志文件。
  • 运行 2 个实例允许重新启动一个中继器而不影响另一个中继器。

相关内容