Днес открих много странен проблем. Пусках Redhat Enterprise Linux 6 и процесорът беше 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 секунди, ако никоя друга нишка не събуди нишката. Всеки път, след като функцията се върне, se.nr_wakeups в /proc/5545/sched ще се увеличи с 1. Но това никога не се случи, след като открих, че нишката има някои проблеми.
Някой има ли някакви идеи? Възможно ли е interruptible_sleep_on_timeout() никога да не се връща?
Актуализация: Намирам, че проблемът няма да възникне, ако задам CPU афинитет за тази нишка. Ако го прикача към специално ядро, тогава всичко е наред. Има ли проблеми с планирането на SMP?
Актуализация отново: След като деактивирах хипернишка в BIOS, не съм виждал такъв проблем досега.
interruptible_sleep_on_timeout
в стека? Това нишка на ядрото ли е? - person David Schwartz   schedule 22.11.2011