제가 진행 중인 프로세스의 상태가 약간 혼란스럽습니다. 다음과 같습니다.
$ ps -eal | head -n 1 ; ps -eal | grep perf
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 7843 7842 0 80 0 - 10838 - pts/6 00:00:00 perf
-- 따라서 상태는 이고 S
, man
페이지 설명은 입니다."S 중단 가능한 절전 모드(이벤트가 완료될 때까지 대기)", 이벤트를 기다리고 있습니다. 어딘가 대기 채널에 등록되어 있는 것 같아요. 그러나 대기 채널은 입니다 WCHAN -
. 어느 man
페이지에서 설명하는"작업을 실행하면 이 열에 대시('-')가 표시됩니다."
또한 을 /proc/7843/status
포함 State: S (sleeping)
하고 /proc/7843/wchan
포함 합니다 0
. 0
나는 proc//wchan
같은 말을 한다고 생각합니다 . 작업은 아무것도 기다리지 않습니다.
제가 뭔가 잘못 이해한 걸까요, 아니면 모순되는 걸까요?
-
그리고 작업이 실제로 실행되고 있지 않습니다. 이것이 wchan
예약되기를 기다리고 있다는 의미는 아닙니다 .
출력이 잘못 구성되었을 가능성이 있습니까 wchan
? 저는 Ubuntu 14.04, 커널 3.13.0-86-generic을 실행하고 있습니다.
다른 프로세스를 확인하면 다음이 표시됩니다.
$ ps -eal | head -n 1 ; ps -eal | grep fish
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 2407 2399 0 80 0 - 47675 wait pts/0 00:00:07 fish
1 S 1000 2409 1 0 80 0 - 5500 poll_s ? 00:00:00 fishd
0 S 1000 2507 2399 0 80 0 - 45333 poll_s pts/3 00:00:00 fish
0 S 1000 2567 1 0 80 0 - 8366 wait ? 00:00:00 fish
- 그럼 WCHAN
여기서는 문제 없어요.
답변1
프로세스 상태와 wchan은 커널에 의해 자동으로 반환되지 않습니다.
이는 프로세스 상태에 액세스하고 wchan 정보를 얻는 사이에 해당 상태가 절전 모드에서 실행 중으로 변경될 가능성이 있음을 의미합니다.
그래서 경쟁이 있습니다.
이것스택워킹 과정커널 내부에서 wchan 정보를 얻는 것도 문제가 있으며 모든 경우를 다룰 수는 없습니다.
교차 확인 cat /proc/$pid/stack
(루트만 해당)하거나 cat /proc/$pid/syscall
프로세스가 커널의 어디에 있는지에 대한 추가 정보를 얻을 수 있습니다.
답변2
WCHAN 값이 계산된 것으로 보입니다. 커널 소스 코드에서 arch/x86/Kconfig
:
config SCHED_OMIT_FRAME_POINTER
Single-depth WCHAN output
Calculate simpler /proc/<PID>/wchan values. If this option
is disabled then wchan values will recurse back to the
caller function. This provides more accurate wchan values,
at the expense of slightly more scheduling overhead.
그리고 다음에서 Documentation/filesystem/proc.txt
:
wchan Present with CONFIG_KALLSYMS=y: it shows the kernel function
symbol the task is blocked in - or "0" if not blocked.
그래서 가끔 wchan이 계산을 잘못하는 것 같아요.