DSOMEIP丢数据问题分析和总结:

(1)问题现象

        无论使用arm64硬件、x86 ubuntu电脑、ubuntu docker哪种组合进行DSOMEIP event通信,接收端都会在event payload长度增加到一定程度时udp方式出现丢数据现象。

        总体上arm64硬件略优于x86 ubuntu电脑,x86 ubuntu电脑略优于ubuntu docker。并且用wireshark抓包时每次都可以抓到丢的SOMEIP数据包,并且数据包完整并且TP顺序没有问题。

        如果使用vrte example的默认json配置文件,根据上面通信载体不同丢数据现象会出现在event payload长度为500KB、200KB、或50KB。

(2)问题分析

        问题可能是由于硬件资源和网络环境的限制,造成过大的数据包分成过多的TP(以1个tp长度1400为例,两个tp之间时间间隔大约为0.07-0.08ms),从而使接收端接收不及时tp无法组成完整的SOMEIP数据包。

(3)解决方法

 优化方案应该包含以下方面:

[a] 连续发送多个tp后,发送端等待1个小延时,如1ms。

[b] 默认接收端数据接收buffer是1MB,接收大于1MB的数据需要对应增加buffer长度。

[c] 优化SOMEIP-SD的过程,减少测试过程中SD对通信过程的影响。

发送端json几个重要配置的说明:

"event_burstSize":"20"    // 连续20个tp中间不加时间间隔,这个地方如果不填则默认为0

"event_maximum_segment_length": "0x578" // tp长度为1400

"event_separation_time":"0.001"                                  // 两个burst之间的时间间隔,这个从代码看很有误导性,其实可以填小数,单位是s而不是ms。这块之前我们理解错了,应该是json配置解析时比较隐蔽的乘以了1000,从代码看起来还以为直接填整数ms。

接收端json几个重要配置的说明:

"udp_maximum_receive_buffer_size": "5"  // 接收端buffer为5MB

附件为实验用的一对json文件。

在ubuntu docker环境下测了3000KB-1s和1000KB-350ms 10分钟都没有再出现丢数据

DSOMEIP丢数据问题分析和总结:_第1张图片

你可能感兴趣的:(工作笔记,SOME/IP,SOMEIP)