VOLTE语音时延问题定位

来源:互联网 发布:dnf剑宗短剑精通数据 编辑:程序博客网 时间:2024/06/03 19:30

现象

两个终端拨打VOLTE存在语音时延的问题。其中,一个终端为4G VOLTE,位于SMC站下,另外一个终端为2/3G,位于宏站下。在此场景下,随着呼叫时间变长,极大概率出现4G终端接收到的语音延迟,时间为秒级,但是2/3G终端依然正常。

定位

尝试了其他场景,包括两路VOLTE(一个终端在SMC下,一个终端在宏站下以及两个终端都在宏站/SMC下),宏站下一路VOLTE一路2/3G,均未出现时延问题。首先,需要定位时延点是在核心网还是在基站设备。在出现问题的场景下,拔掉SMC的WAN口网线后,终端在几秒内仍然能够接收到语音,说明语音包已经到达了基站设备,缓存在了基站设备或终端中。
在实验室进行复现,同时抓包,对比了交换机的镜像抓包以及基站内部tcpdump抓包,发现交换机的镜像抓包中,下行语音包以20ms的间隔均匀到达,在基站内部的tcpdump抓包中,存在攒包的现象,即较长一段时间内(几百毫秒级别),基站没有接收到任何网口数据,随后基站以极小的间隔收到了这一段的所有语音包。怀疑是由于网口的攒包现象,造成了语音时延。
做了一个测试版本,在frwk接收UDP报文的代码中,手动增加时延。在出现问题的场景下,手动构造收包时延。发现构造时延后,终端果然出现语音延迟,至此,已经基本确认了产生语音延迟的直接原因。
下一步,需要确认发生攒包现象的原因。又做了一个测试版本,可以手动创建一个指定优先级的任务,该任务持续执行死循环若干秒。在终端建立呼叫后,创建各个优先级任务进行测试,发现当创建的任务的优先级大于等于50时,终端出现时延,因此怀疑网口收包任务的优先级为50,在出现问题的场景下,存在高于这个优先级的任务持续运行的情况,随着时间积累,逐步到达影响通话的程度。

解决

咨询博通技术支持,得到网口接收任务的任务名irq/12-Timer1。博通的网口驱动同样采取中断+轮询的方式,博通使用定时器去触发轮询任务执行。在初始化脚本中提高该任务优先级至66后,手动创建优先级为65的任务执行死循环,不再出现语音时延的情况,确认修改有效。由于该任务优先级会影响到所有网口收包,因此技术支持并不建议将此调的过高。使用该版本升级后,呼叫保持2个半小时,终端语音时延不到1s。

遗留问题

在定位过程中,还有一些问题是没有解释清楚的:
1. 为何只有一路VOLTE一路2/3G的情况下才会出现?
使用手动构造时延的版本,在多个场景下进行了测试,均无法构造出语音时延。例如在两个终端都在小站下的情况,手动构造时延后,终端在手动构造时延期间无任何语音,随后语音立即恢复为当前语音,即时延过程中的语音丢失。而在出现问题的场景下,手动构造时延的现象是,时延结束后,终端语音变为时延时的语音,语音只是产生了时延而并没有丢失。
2. 终端语音播放机制?
从基站的行为来说,收包产生时延后,积攒的数据包会很快发送至终端,而非以20ms的间隔发送给终端(因为基站不区分语音和数据),因此,语音包应该是积攒在终端了。难道,终端在接收到语音包后完全不理会包到达的时间以及间隔,只是均匀地以20ms为间隔播放给用户,如果没有语音包就播空白音?
3. 不同场景终端机制不同?
但是,如果按照上面的分析,终端攒包的话,终端应该是分不清楚对方是2/3G还是VOLTE的,为何针对不通场景,终端表现还不一致?

0 0
原创粉丝点击