Сегодня обнаружил очень странную проблему. Я запускал 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() никогда не возвращается?
Обновление: я обнаружил, что проблема не возникнет, если я установлю привязку ЦП к этому потоку. Если я его прикалываю к выделенному ядру, то все ок. Есть ли проблемы с планированием SMP?
Обновление еще раз: после того, как я отключил гиперпоточность в BIOS, я до сих пор не видел такой проблемы.
interruptible_sleep_on_timeout
в стеке? Это поток ядра? - person David Schwartz   schedule 22.11.2011