Linux
使用多程序或單程序執行 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);
在上面的 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 個實例允許重新啟動一個中繼器而不影響另一個中繼器。