Linux

使用多程序或單程序執行 dhcrelay 有什麼區別嗎?

  • January 24, 2013

我想問一下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);

在上面的 poll 函式超時或接收到一個數據包後,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 個實例允許重新啟動一個中繼器而不影響另一個中繼器。

引用自:https://serverfault.com/questions/458099