4

我们有一个“发布者”应用程序,它使用多播发送数据。该应用程序对性能极为敏感(我们正在微秒级别进行优化)。侦听此已发布数据的应用程序可以(并且通常)与发布应用程序在同一台机器上。

我们最近注意到一个有趣的现象:执行 sendto() 的时间与机器上的侦听器数量成正比增加。

例如,假设没有侦听器,我们的 sendto() 调用的基本时间是 5 微秒。每个额外的侦听器都会将 sendto() 调用的时间增加大约 2 微秒。所以如果我们有 10 个监听器,现在 sendto() 调用需要 2*10+5 = 25 微秒。

这对我来说表明 sendto() 调用会阻塞,直到数据被复制到每个侦听器。

聆听方面的分析也支持这一点。如果有 10 个侦听器,每个侦听器都会比前一个侦听器晚两微秒接收数据。(即第一个监听器在大约 5 微秒内获取数据,最后一个监听器在大约 23--25 微秒内获取数据。)

有没有办法在程序级别或系统级别改变这种行为?类似于非阻塞/异步 sendto() 调用?或者至少阻塞直到消息被复制到内核的内存中,这样它就可以在不等待所有侦听器的情况下返回)?

4

2 回答 2

0

很抱歉问这个问题,但是套接字是非阻塞的吗?(添加O_NONBLOCK到端口的标志集——见fcntl

于 2011-07-29T05:14:15.090 回答
0

多播循环非常低效,不应该用于高性能消息传递。正如您在每次发送时指出的那样,内核正在将消息复制到每个本地侦听器。

推荐的方法是使用单独的 IPC 方法分发到同一主机上的其他线程和进程,共享内存或 unix 套接字。

例如,这可以通过在同一个 ZeroMQ 套接字上的 PGM 多播连接之上添加一个 IPC 连接来使用 ZeroMQ 套接字轻松实现。

于 2011-07-29T05:21:48.883 回答