我打算编写一个监听UDP端口的程序,然后将数据分派给多个服务器实例。服务器软件的代码一直是监听端口本身的结构,而不是从本地运行的另一个程序接收数据。所以我的想法基本上是通过环回接口从前端程序到服务器实例创建第二个UDP流。 该应用程序对延迟至关重要,即开销不应超过1毫秒。我想知道这是否是最好的方法:我担心数据包会被内核再次调度(在我的情况下是linux)。如果我是对的,这种延迟会明显吗?如果是这样,是在前端和服务器应用程序之间重写新形式的进程间通信的唯一解决方案吗?
答案 0 :(得分:0)
调度不是真正的问题。如果进程或线程在select()
或recvmsg()
上等待,它应该几乎立即被传入的数据报唤醒。 (发送方在调用sendmsg()
时放弃其CPU切片,内核让它通过环回传递消息,然后接收方将高于调度程序中的发送方。)
如果接收器已准备好接收,则通过环回接口的延迟将为亚毫秒。
您的大部分延迟都来自于每个接收器在从套接字读取数据包之间所做的任何事情。例如,如果接收者在收据之间需要0.5毫秒的CPU时间处理,那么您的延迟将大约为0.5毫秒。但是如果你为每个CPU内核运行3个这样的接收器,那么你的延迟不能小于1.5毫秒。