今天发现了一个很奇怪的问题。我运行的是 Redhat Enterprise Linux 6,CPU 是 Intel E31275(4 核,8 线程)。我发现一个内核线程(我称之为 my_thread)不能正常工作。使用“ps”命令,我发现 my_thread 的状态一直在运行:
ps ax
5545 ? R 3:14 [my_thread]
15774 ttyS0 Ss 0:00 -bash
...
但它的运行时间始终是 3 点 14 分。既然它正在运行,为什么总时间没有增加?从 proc 文件 /proc/5545/sched 中,我发现该线程的所有统计信息(包括唤醒计数 (se.nr_wakeups))也始终相同。
从 /proc/5545/stack 中,我发现这个线程调用了这个函数并且从未返回:
interruptible_sleep_on_timeout(&q, 3*HZ);
理论上,如果没有其他线程唤醒该线程,该函数将每 3 秒返回一次。每次函数返回后,/proc/5545/sched 中的 se.nr_wakeups 都会增加 1。但是在我发现线程有问题之后,这种情况就再也没有发生过。
有没有人有一些想法?interruptible_sleep_on_timeout() 是否有可能永远不会返回?
更新:如果我为此线程设置 CPU 亲和性,我发现问题不会发生。如果我把它固定到一个专用的核心上,那么一切都很好。SMP调度有问题吗?
再次更新:我在BIOS中禁用超线程后,直到现在我才看到这样的问题。