2011-10-21 3 views
2

오늘 아주 이상한 문제가 발견되었습니다. Redhat Enterprise Linux 6를 실행했으며 CPU는 Intel E31275 (4 코어, 8 스레드)입니다. 하나의 커널 스레드 (my_thread라고 부름)가 올바르게 작동하지 않는 것을 발견했습니다.스레드의 상태가 실행되고 있지만 CPU를 사용하지 않는 이유는 무엇입니까?

ps ax 
5545 ?  R  3:14 [my_thread] 
15774 ttyS0 Ss  0:00 -bash 
... 

그러나 그것의 실행 시간은 항상 3시 14분했다 "PS"명령으로 , 나는 my_thread의 상태가 항상 실행중인 발견했다. 실행 중이므로 왜 총 시간이 증가하지 않았습니까? proc 파일/proc/5545/sched에서이 스레드에 대한 wakeups count (se.nr_wakeups)를 포함한 모든 통계가 항상 동일하다는 것을 알았습니다.

는/proc 디렉토리/5545/스택에서,이 함수를 호출이 스레드를 발견 결코 반환 : 다른 스레드가 스레드를 깨어하지 않는 경우

interruptible_sleep_on_timeout(&q, 3*HZ); 

이론적으로이 기능은 매 3 초마다 반환합니다. 함수가 반환 된 후에는/proc/5545/sched에있는 se.nr_wakeups가 1 씩 증가합니다.하지만 스레드에 문제가있는 것을 발견 한 후에는 이런 일이 발생하지 않았습니다.

어떤 아이디어가 있습니까? interruptible_sleep_on_timeout()이 결코 반환하지 않을 가능성이 있습니까?

업데이트 : 이 스레드에 대한 CPU 선호도를 설정하면 문제가 발생하지 않습니다. 전용 코어에 고정하면 모든 것이 정상입니다. SMP 스케줄링에 문제가 있습니까?

다시 업데이트 : BIOS에서 하이퍼 스레딩을 해독 한 후 지금까지 그런 문제를 보지 못했습니다.

+0

스택의 'interruptible_sleep_on_timeout'보다 위에 무엇입니까? 이것은 커널 스레드입니까? –

답변

4

먼저 꺼짐, R은 스레드가 실행 상태가 아니지만 실행 가능함을 나타냅니다. 즉, 실행된다는 의미는 아니며 스케줄러가 실행을 위해 선택할 수있는 상태에 있음을 의미합니다. 이 둘 사이에는 큰 차이가 있습니다.

비슷한 의미로 interruptible_sleep_on_timeout (& q, 3 * HZ); 3 개의 jiffies 이후에 스레드를 실행하지 않고 3 개의 jiffies를 실행 한 후에 사용할 수 있도록합니다. 실제로 "ps"를 실행 가능한 것으로 간주하므로 시간 초과가 실제로 발생할 수 있습니다.

문제의 커널 스레드에 대해 아무 말도하지 않았기 때문에 자신의 코드 또는 표준 커널 코드에 있는지 알지 못하기 때문에 자세히 대답 할 수 없습니다.

설명 된 상황의 한 가지 가능한 이유는 다른 스레드 (사용자 또는 커널)가 스레드보다 우선 순위가 높기 때문에 스케줄러가 실행을 위해 절대로 선택하지 않는다는 것입니다. 그렇다면 실시간 우선 순위 (SCHED_FIFO 또는 SCHED_RR)로 실행중인 스레드가 아닙니다.

+0

답장을 보내 주셔서 감사합니다. 이 문제가 발생하면 시스템이 유휴 상태였습니다. CPU 유휴 비율은 99 % 이상이었습니다. – flypen

+0

업데이트 :이 스레드에 대해 CPU 선호도를 설정하면 문제가 발생하지 않습니다. 전용 코어에 고정하면 모든 것이 정상입니다. SMP 스케줄링에 문제가 있습니까? – flypen

관련 문제