c++ - 丢失的数据包仅在第一次运行时发生
问题描述
我正在尝试提高在大型网络上运行的多播应用程序的性能(以减少其丢包)
我的实验表明,在应用程序的第一次运行中,有一些丢失的数据包。但是当我在上次运行后再次运行应用程序时(有时也会有一点延迟),没有丢包。虽然当我在长时间延迟(例如 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);
////
}
我想知道是否有任何可能的方法来添加一些代码来确定交换机(或路由器)是否已经预热!足够的?
解决方案
好吧,如果您的交换机和路由器是动态组播网络的一部分(例如PIM
,基于IGMP
和接收器),并且您无法控制 m-cast 网络配置(以便您可以修复它,或设置静态路径),那么您无能为力。
即使您确实具有控制访问权限,也并非所有导致 m-cast 数据包丢失的事件都可以“修复”(其中一些是 m-casting 固有的)。例如,如果您的 m-cast 以某种PIM-sparse
模式运行,那么从共享树切换到最短树可能会导致丢失。当一个集合点(RP
在稀疏模式 m-casts 上找到)完成发送者的注册过程时,一些数据包丢失是不可避免的,等等。
请咨询您的网络管理员 - 看看他们是否可以帮助您在发送者(并非总是有可能)和接收者之间设置“静态”路径,或者至少最大限度地减少数据包丢失(在 m-casting 中有某些调整) .
从应用程序的角度来看:如果您还编写接收器的部分 - 那么最好采用一些反馈机制来指示数据包丢失和可能的内容重传。
推荐阅读
- javascript - 引导进度条文本
- c++ - const_iterator 在类外被调用的问题
- php - 如何从 Postgresql 中的不同字段在 php 中添加日期和时间
- hibernate - EntityGraph 不获取动态提供的关系
- python - Python Pandas:从时间列中删除 0 天后缀
- siri - 如何让 siri 说出列表中的项目?
- javascript - 通过javascript将十六进制字符串发送到串行
- nestjs - NestJs - 没有让 Injectable 在订阅者上工作
- flutter - 整数不能为空
- node.js - AWS Lambda 函数在不打印整个结果的情况下执行