1

我们使用recv(2)来侦听网络管理应用程序中的传入 ICMP 数据包,其中有一个状态轮询功能来 ping 所有托管主机。

在生产环境中,托管主机的数量可能会变得非常大(超过 1,000 台),此时,当执行所述状态轮询时,我们会按顺序发送所有 ping 请求,中间不会有任何延迟。

显然,这将导致几乎同时发回许多 ping 回复,并且我们的调度例程似乎无法跟上。这似乎导致数据包被丢弃,并且我们的应用程序实际上从未收到过 ping 回复。我们相信是因为许多主机被错误地检测为“不可用”。

调度程序除了将收到的回复添加到各种“收件箱”之外,什么也不做,稍后由另一个线程处理,即它不会花费太多时间并且可能无法进一步优化。

recv 使用的内部数据包缓冲区(在内核中?在网络硬件中?)是否有可能填满并开始丢弃数据包?如果是这样,是否有一种好方法来确定可以安全执行的合理最大同时 ping 数量(即通过从操作系统获取缓冲区大小)?

4

0 回答 0