vxworks下一次排故小记

vxworks下一次排故小记

这两天加班了,因为一个vxworks下的bug。我加班倒还好,主要是很多同事专家一块陪着排查问题,都加得挺晚。回去后,内心很平静,好像挺长时间没有去用心享受回味这种初春宁静夜晚的美好。不太想写代码看书了,那就随便写点杂记之类的吧。闲谈舒心,码字写意。···


问题

CS结构,tcp协议,客户端我写的,windows c++,服务端接的别人的代码,vxworks6.6 c,也由我负责。

5条网络指令交互,最后一条不回复。重启客户端重连后,执行此5条指令,仍然是只有最后一条不回复。最后一条指令在回复网络指令之前多了一个写文件的操作。
由于种种原因,不能抓包。是的。交换机也不让开镜像口。没有办法,人总是在各种constrain下工作、debug。


分析

多次试验中,问题出现了2次。第一次S端没日志,根本没法排,没法定位。因为CS两端的代码,已经找无数专家审查过了,找专门测试团队分析过了。都没找出毛病。最后给出建议S端加上网络通信的日志,再出不就好定位了。。。是的,如果直接抓包,都不是事。。。。

第二次又出了,故障时的日志不全。只有开始几分钟的,后续交互的网络日志全没有。。。。。是的,就是这么村。。。平时测试时,日志都是好好的。没有出现过丢日志的情况。连vxworks下flush不能保证文件写入磁盘只能关闭文件再打开才能保证文件存到磁盘上这种事情也都考虑到并有保证措施。

然而呢,故障日志丢失。。。。。又陷入了困境。。。要定位网络问题,需要日志,现在日志又丢失不全。。。又回到了第一次问题出现的处境。。

配置完全相同的好几套机器,出故障的都是同一套。由于种种原因,很难回到手中进行测试。


排查

  1. 高层关注,专家组团,共同排查。。。1)一些观点认为日志丢失与网络数据不回是独立的两个问题。因为虽然先写文件再发回令,写文件不成功,会返回的。所有网络指令都在一个任务中由消息队列触发是串行的,一条卡死,所有都不响应的,现象是重试时也只有最后一条不回,说明没有卡住,文件丢失是vxworks文件系统一些bug导致,并不直接引起网络不回的问题,要有针对性的分析,重点是网络不回的那个问题。2)一些观点认为二度故障概率很低,日志丢失、单独文件操作的指令不回,这些都指向了文件系统,那么,根源应该与文件系统相关。但是,如果把这个问题就简单定位到vx文件系统碎片处理等导致文件创建写入失败,又显得证据不足,苍白难有说服力。3)一些观点认为当前应当完善S端的日志系统,确保各种情况下日志都能存在。另外在手头机器上进行强度测试,测试vx文件系统文件创建失败、写入失败的概率有多大。摸一摸vx文件系统的可靠性。4)一些观点认为家中机器强度测试基本大海捞针,怕方向不对。要求沟通协调,把故障的机器带回,进行问题复现实验。

  2. 终于,在多方努力下,故障的机器回来了。开始实验,没做几遍就出了。大批专家在场,直接telnet登陆vxworks机器,“i”打印任务信息,没有异常退出的信息,“tt”显示相应任务调用栈,也没有什么异常。通过一通pciShowxxx命令,只能看到没有文件io。但是当执行“devs”时,没有找到对应的磁盘盘符。。。本想进到日志目录下去看下日志写了几个文件,却连磁盘都找不到了。。。。。

  3. 后续,所有的问题都迎刃而解了。。。。。vxworks加载后,磁盘偶发故障,再也看不到磁盘,涉及写文件的操作将导致机器整体变慢,平时200ms完成的操作需要5分钟,而且有时会引起后续无文件操作的处理也变得极慢,但所有的网络数据都收到了,但是回复太慢,C端报超时,当C端重启时,建立了一个新的socket连接,S端的超时数据在另一条链接上,新的链接上只会回复新链接上请求的数据。。。。这就都理顺了。。。


总结

  1. 仔细分析。良好的分析确实是在未知的情况下得到挺多参考信息的。可以让debug有一个良好的方向、头绪。

  2. 大胆设想。因为故障与文件有相关性,但是是否是因果关系,还是就只是一起出现,属于并发故障,在这一点上,并没有再深入分析。因为到了文件系统那,只是知道就vx有这么个事,以前别人碰到过创建多个文件,但是只有部分成功,可能是磁盘碎片导致的。但是并不能说磁盘碎片导致一些文件写失败然后就直接引起网络数据不回复或卡住。如果想得远点,开脑洞去联想,那么是可以预先就想到磁盘的。

  3. 头脑风暴式的联想。可能找到了一个大概率点的方向,但是又觉得太粗浅苍白,然后直接否定这个大概率方向,这样是不合适的。正确的做法就是,从这个概率最大的蛛丝马迹,不受任何限制的去联想一通,而不是受限于已有磁盘碎片的先入为主的思维桎梏,最终是可以分析到磁盘上来的,到那个时候,就剩下求证的事情了。

  4. 大牛的技巧。telnet,i,tt taskId,devs、cd、help、lkup。

adrSpaceShow(details 0, 1) - Show details of the Address Space, including physical address, User Region address and kernel virtual mapping.

envShow(taskId) - Show environment for a given task

iosDevShow - Show loaded I/O Devices

iosDrvShow - Show I/O Device Driver Function Table

iosFdShow - show open File Descriptors

memShow - show memory usage statistics

moduleShow - show downloaded modules

objShowAll - show the list of all the objects in the system (semaphores, tasks, msgQs, etc...)

objShow (objectId) - show detailed information about an object
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值