我们有一个“发布者”应用程序,它使用多播发送数据。该应用程序对性能极为敏感(我们正在微秒级别进行优化)。侦听此已发布数据的应用程序可以(并且通常)与发布应用程序在同一台机器上。
我们最近注意到一个有趣的现象:执行 sendto() 的时间与机器上的侦听器数量成正比增加。
例如,假设没有侦听器,我们的 sendto() 调用的基本时间是 5 微秒。每个额外的侦听器都会将 sendto() 调用的时间增加大约 2 微秒。所以如果我们有 10 个监听器,现在 sendto() 调用需要 2*10+5 = 25 微秒。
这对我来说表明 sendto() 调用会阻塞,直到数据被复制到每个侦听器。
聆听方面的分析也支持这一点。如果有 10 个侦听器,每个侦听器都会比前一个侦听器晚两微秒接收数据。(即第一个监听器在大约 5 微秒内获取数据,最后一个监听器在大约 23--25 微秒内获取数据。)
有没有办法在程序级别或系统级别改变这种行为?类似于非阻塞/异步 sendto() 调用?或者至少阻塞直到消息被复制到内核的内存中,这样它就可以在不等待所有侦听器的情况下返回)?