当前位置

不是死循环的死循环

碰到一件怪事。

是测试某软件产品,在我们的 4-cpu 的服务器上运行,用 top -H,可以监视到其工作主进程的每个线程的情况。

问题是不定期的有一个(甚至2个)线程占满 cpu(100% usr),看起来是典型的死循环;但怪就怪在这个死循环的线程能自己恢复正常,我设置了 top 每 10 秒输出日志,结果还发现每次占满 cpu 都是大约整整 3 分钟的时间,然后负载就下来了。

很容易得出结论,这里还有一个控制线程,每隔一定的时间检查各个 worker 的情况,发现不对了就恢复之...

于是把这个现象报告给 ISV,对方觉得奇怪,我们没有这种定时检查的机制啊?怎么会每次都正好 3 分钟?

显然这是一个诡异的 bug,到现在还没有查出。
而我有时候就想,如果没有主动控制?我怎么才能写出一个正好执行 3 分钟的死循环 bug 呢?

昨天突然想到这么一段代码:

  1. int main()
  2. {
  3.     int i = 1;
  4.     while (i != 0) i++;
  5. }

在 PIII 700 上跑了一下,嗯,成功的写出一个正好 45 秒内占满 cpu 的死循环。

不晓得最后找到的 bug 是否如我的猜测

Topic: 

评论

用strace看看呗,看看他在干什么

这种情况下无法 strace 进去

回忆一下你 strace 看到的是什么?
是系统调用!!!
但这类死循环里面没有系统调用

OS 在每次系统调用结束的时候会考虑是否将进程切换走,以执行别的等待队列中的进程,但这类进程因为没有系统调用,全在 usr 态里面,所以会占据 100% cpu

嗯?我刚发的东西没有了?

如果在不同CPU的机子上运行,这个循环所占的时间就不同了吧

yes

对于这个正好3分钟,十分的奇怪。。