Сегодня я обнаружил очень странную проблему.
Я запускал 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 такой проблемы до сих пор не было.