不是死循环的死循环

碰到一件怪事。

是测试某软件产品,在我们的 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 是否如我的猜测

对于这个正好3分钟,

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

如果在不同CPU的机子

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

yes

yes

嗯?我刚发的东西没

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

用strace看看呗,看看

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

这种情况下无法 strace

这种情况下无法 strace 进去

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

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