碰到一件怪事。
是测试某软件产品,在我们的 4-cpu 的服务器上运行,用 top -H,可以监视到其工作主进程的每个线程的情况。
问题是不定期的有一个(甚至2个)线程占满 cpu(100% usr),看起来是典型的死循环;但怪就怪在这个死循环的线程能自己恢复正常,我设置了 top 每 10 秒输出日志,结果还发现每次占满 cpu 都是大约整整 3 分钟的时间,然后负载就下来了。
很容易得出结论,这里还有一个控制线程,每隔一定的时间检查各个 worker 的情况,发现不对了就恢复之...
于是把这个现象报告给 ISV,对方觉得奇怪,我们没有这种定时检查的机制啊?怎么会每次都正好 3 分钟?
显然这是一个诡异的 bug,到现在还没有查出。
而我有时候就想,如果没有主动控制?我怎么才能写出一个正好执行 3 分钟的死循环 bug 呢?
昨天突然想到这么一段代码:
-
int main()
-
{
-
int i = 1;
-
while (i != 0) i++;
-
}
在 PIII 700 上跑了一下,嗯,成功的写出一个正好 45 秒内占满 cpu 的死循环。
不晓得最后找到的 bug 是否如我的猜测
Topic:
评论
用strace看看呗,看看
用strace看看呗,看看他在干什么
这种情况下无法 strace
这种情况下无法 strace 进去
回忆一下你 strace 看到的是什么?
是系统调用!!!
但这类死循环里面没有系统调用
OS 在每次系统调用结束的时候会考虑是否将进程切换走,以执行别的等待队列中的进程,但这类进程因为没有系统调用,全在 usr 态里面,所以会占据 100% cpu
嗯?我刚发的东西没
嗯?我刚发的东西没有了?
如果在不同CPU的机子
如果在不同CPU的机子上运行,这个循环所占的时间就不同了吧
yes
yes
对于这个正好3分钟,
对于这个正好3分钟,十分的奇怪。。