2013-06-27 78 views
2

发布摘要:AF_UNIX稳定发送,突发接收。Unix域套接字:使延迟恒定

我有一个应用程序B通过unix域数据报套接字接收数据。有对等应用程序A向其发送数据。 A和B都连续运行(并且是SCHED_FIFO)。我的应用程序A也打印接收时间。

对等应用程序B可以在不同的时间发送数据(仅以毫秒为单位)。理想情况下(我所期望的)分组发送延迟应该与接收延迟完全匹配。例如:

A sends in time   : 5ms  10ms  15ms  21ms 30ms 36ms 
B should receive in time : 5+x ms 10+x ms 15+x ms 21+x ms ... 

其中x是一个常数延迟。

但是,当我尝试了我B中观察的是:

A sends in time   : 5ms  10ms  15ms  21ms 30ms 36ms 
B received in time   : 5+w ms 10+x ms 15+y ms 21+z ms ... 

(W,X,Y,Z是不同的恒定延迟)。所以我无法预测发送时间时的接收时间)。

是因为unix域套接字中涉及到一些缓冲区?请为此问题提出一些解决方法,以便从发送时间可以预测接收时间。我需要1毫秒的准确度。

(我用香草的Linux内核3.0)

+0

注意:我得到了一个可以调整的参数/ proc/sys/net/unix/max_dgram_qlen,它可以设置为1.但仍然存在问题。也可能是调度延迟。 –

+0

它是UDP还是Unix域套接字?它不能兼而有之。另外,为什么你需要1毫秒的精度?如果它不可行会怎么样?你的recv()阻塞还是非阻塞? –

+0

@John我的意思是AF_UNIX和SOCK_DGRAM都是 –

回答

0

当你正在使用阻塞的recv(),当没有数据报可你的程序将不定期。这对你的用例不利 - 你希望你的程序保持热点。所以让你的recv()非阻塞,并通过简单的忙等待来处理EAGAIN。这将消耗一个核心的100%,但我认为你会发现它可以帮助你实现你的目标。

+0

似乎是候选人的想法之一。但是我无法让CPU忙碌起来:-( –

+3

所以你想要高精度,低延迟,但是不能让CPU保持忙碌?祝你好运。:) –

+0

谢谢John :-)。但让我试试看。 –