(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分钟都没有再出现丢数据