定下心来,还是专心做技术吧~
年前必须完成!
先看典型案例(personal info del):
XG8B 2PON口下挂AN5200_10B 和AN5200_07B ONU,升级系统并重启后单播和语音有严重丢包,查看ONU的上行带宽限速只有0.5M,重启线卡后现象消失。在其他测试中对ONU拔纤插纤操作也出现过同样的问题。
(1) 首先在命令行中查看onu sla配置值,发现上行sla 配置只有0.5M, 配置显然未下发:
(2) 然后打开sla配置开关,显示onu的sla配置已完成(FINISHED);
(3) 重置ONU sla配置标识为配置未完成(UNFINISHED),业务恢复;由此分析问题发生时,应用层未将sla配置下发到PON芯片,应用层保存的sla配置标识已为FINISHED。造成该问题有几种可能:
1) onu掉线后应用层保存的sla配置标识未改变(此时应变为UNFINISHED);
2) 应用层下发配置到PON芯片未成功,但返回成功导致配置变更为FINISHED;
3) 其他未注意的因素;
(4) 检查代码后确认所有ONU掉线的地方都会更新sla配置标识,可能1不可能出现;和PON驱动确认也不会出现可能2的情况;
(5) 试图重现问题时发现单盘重启后存在ONU掉注册重新注册的流程,分析代码发现近期在系统启动流程中增加了ponReopenAllPorts()调用,该调用会导致已经注册的ONU掉注册;
(6) 阅读应用层sla模块代码发现onu掉注册处理接口将该全局变量onu的sla配置标识置为UNFINISHED时,没有任何保护。也就是说,如果在配置sla配置标识为FINISHED前发生任务切换,sla配置标识可能被修改为UNFINISHED,任务切换回去后再接着配置为FINISHED。
Onu掉注册接口处理:
应用层下发sla配置到pon芯片处理流程,若在配置成功处发生任务切换应该就会出现测试发现问题:
(7) 分析系统中的任务:
Sla配置接口由onu 配置任务调用,onu配置任务优先级为80,onu授权模块初始化后该任务即开始运行,运行过程中轮询调用所有配置相关接口,包括sla配置接口。
Onu掉注册接口在事件处理任务接收到ID为7的事件时调用。事件处理任务优先级也为80,在系统初始化第二阶段启动。具体实现如下:
即事件处理任务维护一个消息队列,当事件处理任务接收到ONU掉注册消息时调用上述onu掉注册处理接口(onLinkDeRegEvent())。
事件处理任务和onu配置任务优先级相同,在shell下查看VxWorks操作系统全局变量roundRobinOn,值为0,表示当前系统中并没有开启时间片轮转模式,在相同优先级任务之间不会发生切换,除非onu配置任务等待资源就绪进入block状态。
(8) 继续分析代码,应用层sla配置接口在下发sla配置给PON芯片后不需要等待任何资源。
那么在哪里会出现资源等待呢?继续深入分析pon驱动代码,发现在底层接口ponSetLinkSLA()配置下行sla时需要semTake,而g_olt_list信号量在系统很多地方都会使用,这里很大概率需要等待信号量。
(9) 结合测试问题分析,当应用层配置完上行sla后onu掉注册,pon芯片配置清空,onu sla配置标识置为UNFINISHED,接着继续配置下行sla,配置完成后,sla配置标识置为FINISHED,onu配置任务下次轮询时发现sla 配置为FINISHED,不会再次下发sla配置至PON芯片,因此pon芯片上行sla配置依然为清空后的配置。