网络速率调试心得

如果你的测试程序优先级和网络协议栈优先级不对等的话,有可能出现严重丢包,原因如下:

  1. 网络驱动在接收到报文数据之后提交给协议栈,若此时协议栈优先级高于测试程序,那么测试程序接收报文会一直被阻塞,此时体现在结果上就是丢包,并且这种丢包的值非常稳定,不管你是刚开机就开始测,还是过一段时间,几乎不变,这种我比较喜欢称作“优先级丢包”。(更改于12.01)其实这种丢包值也有可能是0,因为上述在多核情况下至少可以保证有数据被接收到,但是单核情况下就不一定了,测试程序如果是每秒进行统计还好,要是统一再测试之后统计那就会出现测试结果为零的情况,这种大概率就是测试程序运算测试结果时被阻塞,导致不能将结果正确发出(说的就是你,netperf),进而影响最终数据。
  2. 若“优先级丢包”没有发生,即协议栈优先级等于测试程序,那么此时若还丢包,可以试图判断下,内存分配是否有问题,如果网络驱动在接收到报文之后一直没办法将报文放到内存中,也会产生丢包。但是这种丢包有触发条件,首先是要保证在网络测试了一段时间之后才会发生,一般不会在一开始就发生丢包,二是这种丢包的值(百分比)相对不稳定,三是这种丢包类型一般是当网络速率较小时是正常现象,网络速率较大时偶发现象,网络速率极大时常见现象,这种我比较喜欢称作“内存分配丢包”。
  3. 如果“内存分配丢包”发生,那么可能代表协议栈开辟的内存被用完了;或者协议栈开辟的内存中被标记的要释放掉的内存还没有被完全释放掉,导致内存不够用,“饿死”现象发生,此时如果是驱动层的话,你要修改报文发到内存的策略,即尽量保证少用内存,给协议栈释放内存留有足够的时间,具体解决方法是可以将报文暂时存放在一个永久存在且预先分配好的内存池中,并把报文地址传到协议栈,等到协议栈把报文搞定了,内存池中的暂时存放的报文也被立即释放,这样可以保证报文肯定在内存池中,但是要将内存池设置的比较大,这种解决方式就叫“零拷贝”。

猜你喜欢

转载自blog.csdn.net/weixin_44076906/article/details/108637775
今日推荐