2012-06-26 54 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

感謝您的鏈接,將看到並回來。 –