2012-06-26 31 views
0

我有多个守护进程(一个网关和多个服务,全部运行在同一节点上),其中一些服务守护进程需要在“软实时”响应网络上的到达请求,我的拱门就像我有一个网关守护进程,它将基于协议标记的传入数据包路由到相应的服务守护进程。服务守护进程处理这些请求并将响应发送回放在线路上的gw守护进程。所有的工作都很好,但我没有达到“软实时”并看到滞后。Linux上进程之间共享套接字

我打算在下面以这种方式即兴发挥,共享网关和服务守护程序之间的网络连接,我将有一个通知方案,通过该方案,当数据包到达连接时,gw守护程序不会退出来自套接字队列的数据包在接收到服务守护进程抓取二进制信号量并从套接字队列中取出队列数据的通知时查看协议头并“通知”相应的服务守护进程“数据已到达”。会有2个这样的信号量用于写入,另一个用于读取。当服务守护进程需要发送数据时,它会抓取写入信号并发送数据。当它从网关守护进程收到“数据到达”通知时,它会抓取读取的信号并从套接字中取出数据。在每个新的连接请求上,网关守护进程都会使用“sendmsg”将连接发送到服务守护进程。

任何时候有没有任何机构试过这个方案?你看到这种方法有什么问题吗?请发表评论/建议。

+0

是否建立网关和服务守护程序之间的复制开销造成您的问题?如果你还没有,是什么让你觉得这会有所帮助? –

+0

您目前使用的是什么IPC,并且处理是否需要按照严格的FIFO顺序进/出网关连接? – Duck

+0

#Provost,当数据从gw守护进程传递到服务守护进程时,整个想法是避免用户空间和内核空间之间的数据副本。我相信这是一个重要的头脑,不用说很多文章都谈到过它,很多程序试图避免这种情况。仍然回答你的问题,我还没有找到它。 –

回答

1

如果你想避免复制开销,你应该使用splice,而不是试图在多个守护进程之间共享套接字。该解决方案将非常难以调试和维护。

我希望(也希望)你的网络协议有一个头部,这使得网关很容易知道将数据包路由到哪里,然后是指向服务守护进程的有效负载。

在伪网关做到这一点:

while (data on socket) 
{ 
    header = read(socket, sizeof(header)); 

    service_socket = find_service(header); 
    splice(socket, NULL, service_socket, NULL, header->payload_length, 0); 
} 
+0

splice对进出fds的性质有一些限制,其中一个应该是管道(无论是否进入)。尤其是服务fd在这种情况下不能是套接字,它必须是一个带来消息边界问题的管道,经过大量研究,我决定使用消息队列来通知网关和服务守护进程之间的套接字共享,gw守护进程会通知有关消息队列通道上的新数据的服务守护程序,在接收消息队列通知服务守护进程之后,将获取读信号量并将数据出队。这种方法仍然存在问题。 –

+0

作弊。做什么http://stackoverflow.com/questions/2677262/how-can-i-interconnect-two-sockets-in-linux建议。拼接到管道,然后从管道拼接到另一个套接字。传递这些fds会引起头痛。 –

+0

感谢您的链接,将看到并回来。 –