我正在努力提高我的组播应用程序的性能(以减少它的数据包丢失),它工作在一个巨大的网络上
我的实验表明,在应用程序的第一次运行中,有一些数据包丢失。但是,当我在上次运行后再次运行应用程序时(有时也会有一点延迟),没有数据包丢失。但是,当我在一段长时间(例如,20分钟左右)之后重新运行应用程序时,我再次看到数据包丢失。
当我检查他们的时间戳时,我发现丢失的数据包大多是在开始时发送的数据包。因此,交换机或路由器似乎需要一些预热!或者别的什么(我不知道该如何称呼这种现象)。
我已经检查了tcpdump
结果,接收器应用程序收到的数据包数量与网络购物车收到的数据包数量完全相同。
我已经尝试了以下技巧: 1-更改不同CPU核心上进程的亲和性和调度策略2-更改套接字描述符的优先级
更改套接字描述符的优先级已经使其变得更好(减少了丢失的数据包的数量),但在将优先级设置为高之后,仍然存在一些丢失的数据包)
// For example
MulticastSender multicast_sender;
multicast_sender.init();
// Here I need a function in order to find out the switch is already warmed up or not
while (some condition)
{
////
multicast_sender.send(something);
////
}
我想知道是否有任何可能的方法添加一些代码,以找出交换机(或路由器)是否已经预热!足够的?
发布于 2019-04-30 09:35:52
好吧,如果您的交换机和路由器是动态多播网络(例如,基于PIM
、IGMP
)的一部分,这确实需要特定的路径设置(取决于m-cast网络的类型,各种过程可能会影响设置发送方和接收方之间的路径),而您无法控制m-cast网络配置(以便您可以修复它,或设置静态路径),那么您可以做的并不多。
即使您拥有控制访问权限,也不是所有导致m-cast数据包丢失的事件都可以“修复”(其中一些事件是m-cast固有的)。例如,如果您的m-cast在PIM-sparse
模式下运行,那么从共享树到最短树的切换可能会导致丢失。当会合点(在稀疏模式m-casts上发现的RP
)完成发送者的注册过程时,一些分组丢失是不可避免的,等等。
咨询你的网络管理员-看看他们是否可以帮助你在发送者(并不总是可能)和接收者之间建立一个“静态”的路径,或者至少最小化数据包的丢失(在m- least中有一些调整)。
从应用程序的角度来看:如果您还编写了接收方的部分,那么最好使用一些反馈机制来指示数据包丢失和可能的内容重传。
https://stackoverflow.com/questions/55916082
复制相似问题