QNX4.25死机

有个问题一直想不通,想请教一下:我在QNX4.25下写了一个多任务应用,这个应用在有任务退出,或系统负荷重时,或操作系统死机时,会重新启动QNX。应用在连续运行大约50天后,总会重启。我不知问题出在哪,拷机50天周期太长。请指点一二。QNX4.25不能连续运行哪,还是我的操作导致了系统故障,可50天为周期怎末解释哪?

多数情况下,这是由于某一种系统资源被缓慢耗尽的关系。比方说,哪一个程序不断消耗内存,到50天左右时内存下降到系统不能稳定工作的程度…

在50天里重复执行(执行,结束,执行…)的程序,嫌疑不大,因为程序退出时,系统会收回任何分配给它的资源。比较需要当心的是那些在50天里一直运行,没有停过的程序。

谢谢指点。可我监视了一下系统运行情况,发现内存占用稳定。还有我程序中频繁调用clock(),和使用system(“rtc -s -l hw”),会有影响吗?

可能资源是很缓慢的减少,这样,恐怕要经过至少一星期,才能看出有什么系统资源减少了。不一定是内存,也可能是打开了fd忘记关了。设了proxy忘记取消了等等。时钟开得太多而无法再开等。
fd 是可继承的,所以fork()/spawn()时,fd可能被dup()而忘了关。

有一个叫osinfo的程序,可以用来监视系统资源的分布。试试看你能不能在网上找到。实在找不到的话,每天定时记录sin mem, sin fd… 的输出,或许可以看出什么来。

这几天我记录了sin mem的输出,发现Socklet占用内存在增加。应用中有一个UDP协议的网络任务,在这个任务中,网络包长设为5k,会有问题吗,发送和接收使用同一个套接字是否妥当?什么情况下会让Socklet占用内存增加呢?

如果Socklet的占用内存持续增加,那多数是Socklet自已的问题,与你有一个UDP程序不断在运行无关。

Socklet启动后会根据需要不断增加使用的内存,不过,应该在一个时候达到平衡。如果持续上升,就有可能是Socklet的问题。

如果你能够Upgrade的话,可以试试最新的Socklet。我记得有一些关于使用内存的修正。而且在新的Socklet里,至少你可以限制Socklet的最大使用内存数。

“不是办法的办法”,则是写一个程序,如果Socklet使用内存上升到一定程度,就尝试重新启动Socklet.

谢谢。您真是知无不言。

你好,请问你的问题现在解决了吗?

还没有。郁闷中。。。

如果业务可以中断,那就快要重起之前主动重起机器,一两个月启动一下机器也没什么大不了了。如果业务不能中断,那就再放一台机器作备份,两台机器换着来,A重起的时候,B工作。唉,又要倒换业务。呵呵,这是歪招,一个建议而已

我的系统也出现死机问题,我用sin -l 2 命令,发现我的程序每隔2s,其它的参数不变,但是total CPU occupancy time in milliseconds 占有率增加11196,不知道是什么原因?我的最后一个显示cpu占有率是168217925,怎么会这么大呢?这个osinfo的程序那里能得到呢?那位大侠能出手啊?祝愿大家新年快乐!

原来是因为我的应用里调用了clock()函数,clock()函数在进程连续运行49.7天的时候,累计到最大值0xFFFFFFFF,并维持该值不变了。这并不象WINDOWS下的函数GetTickcounter()可以自动归零。我不知道这算不算QNX4的一个缺陷,如果是一bug,QNX有没有解决该问题的补丁?

哦?这种情况很值得注意
有一点我想不通,这个值累计到0xffffffff以后系统为什么会死掉呢?是QNX自己会死掉还是你的程序需要依靠这个值,因而继续运行不下去了?
另外,能否介绍一下你是通过什么手段检查出来这个问题的,能否具体将一下过程?

我的程序需要判断这个值,相对变化才会继续执行。
要看到现象很简单,写一个程序,循环在屏幕上打印出clock()的值。然后用date命令把系统时间改到50天后,就能看到clock()的值不变了。

我想你可能理解错了,我不是问你怎么才能复现出这个问题,我是问你是怎样确定下来是clock()函数的问题呢?因为表面现象上看仅是系统在重启而已,值得怀疑的因素太多了,为什么最终确定是clock()函数呢?
有时候问题很简单明了,难的是发现的过程,象这种50天才出现一次的问题,发现问题的根源所在就更难了。